我在java socket中读取图像字节时遇到问题。我的iOS客户端在此处发送图像,它需要读取总字节数并将其作为图像存储在服务器端。 当我通过iOS模拟器进行测试时,它非常好用。因为,如果我在模拟器中测试,它会将图像发送到 46,577字节。它读取所有内容非常快速和正确。如果我测试从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);
答案 0 :(得分:1)
你在滥用available()
。它无法作为流结束的测试。见Javadoc。
您也不需要所有数组复制。试试这个:
ByteArrayOutputStream out = new ByteArrayOutputStream();
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
byte[] data = out.toByteArray();
如果您要将图像存储在接收端,则应直接写入FileOutputStream
而不是上面的ByteArrayOutputStream
,并完全忘记data
。