[英]Unable to read all bytes using InputStream read API?
我在 java 套接字中读取图像字节时遇到问题。 我的 iOS 客户端在这里发送图像,它需要读取总字节数并将其作为图像存储在服务器端。 当我通过 iOS 模拟器测试时,它工作得很好。 因为,如果我在模拟器中测试,它会将图像发送到46,577 bytes 。 它读取所有内容非常快速和正确。 如果我测试从 iPhone 设备发送图像的相同代码,它也会发送大约“ 45, 301 字节”,但套接字代码只能读取一些“ 21, 720 字节”,所以只有一半的图像即将到来,(或)有时它仅在“ 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
,然后完全ByteArrayOutputStream
data
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.