gpt4 book ai didi

java - 无法使用InputStream读取API读取所有字节?

转载 作者:行者123 更新时间:2023-12-01 13:27:51 26 4
gpt4 key购买 nike

我在 java 套接字中读取图像字节时遇到问题。我的 iOS 客户端正在此处发送图像,它需要读取总字节并将其作为图像存储在服务器端。当我通过 iOS 模拟器测试时,它工作得很好。因为,如果我在模拟器中测试,它会发送最多 46,577 字节 的图像。它读取所有内容都非常快速且正确。如果我测试从 iPhone 设备发送图像的相同代码,它也会发送大约“45, 301 字节”,但套接字代码只能读取一些“21, 720 字节” strong>”,因此只有一半的图像出现,(或者)有时它读取的内容非常少,大约只有“4,000 字节”。

我不明白为什么它无法仅从设备读取相同大小的数据?有人可以指导我解决这个问题吗?

InputStream input = socket.getInputStream();

byte[] data = new byte[0];
byte[] buffer = new byte[1024];

try {
do {
bytesRead = input.read(buffer);
System.out.println("Reading..bytesRead: " + bytesRead);

// construct an array large enough to hold the data we currently have
byte[] newData = new byte[data.length + bytesRead];
// copy data that was previously read into newData
System.arraycopy(data, 0, newData, 0, data.length);
// append new data from buffer into newData
System.arraycopy(buffer, 0, newData, data.length, bytesRead);
// set data equal to newData in prep for next block of data
data = newData;

} while (input.available() != 0);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.out.println("data: " + data.length);

最佳答案

您滥用了available()。它作为流结束的测试无效。请参阅 Javadoc。

您也不需要所有的数组复制。试试这个:

ByteArrayOutputStream out = new ByteArrayOutputStream();
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
byte[] data = out.toByteArray();

如果您将图像存储在接收端,您应该直接写入 FileOutputStream 而不是上面的 ByteArrayOutputStream,并且忘记 data 完全。

关于java - 无法使用InputStream读取API读取所有字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21718736/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com