Java 无法使用InputStream读取API读取所有字节?
我在java套接字中读取图像字节时遇到问题。我的iOS客户端正在这里发送一个映像,它需要读取总字节数并将其作为映像存储在服务器端。 当我通过iOS模拟器进行测试时,它工作得非常好。因为,如果我在模拟器中进行测试,它会发送高达46577字节的图像。它读起来很快,也很准确。如果我测试同一个代码从iPhone设备发送图像,它也会发送大约“45301字节”,但套接字代码只能读取一些“21720字节”,因此只有一半图像出现,(或者)有时它只能读取大约“4000字节”的图像 我不明白为什么它不能读取来自设备的相同大小的数据?有人能指导我解决这个问题吗Java 无法使用InputStream读取API读取所有字节?,java,sockets,serversocket,Java,Sockets,Serversocket,我在java套接字中读取图像字节时遇到问题。我的iOS客户端正在这里发送一个映像,它需要读取总字节数并将其作为映像存储在服务器端。 当我通过iOS模拟器进行测试时,它工作得非常好。因为,如果我在模拟器中进行测试,它会发送高达46577字节的图像。它读起来很快,也很准确。如果我测试同一个代码从iPhone设备发送图像,它也会发送大约“45301字节”,但套接字代码只能读取一些“21720字节”,因此只有一半图像出现,(或者)有时它只能读取大约“4000字节”的图像 我不明白为什么它不能读取来自设备
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();
如果您在接收端存储图像,您应该直接写入
文件输出流
,而不是上面的ByteArrayOutputStream
,并且完全忘记数据
。您可以尝试使用input.read()
和input.read()一次读取一个字节吗-1
作为while循环的终止条件?因为InputStream.available()
返回可以无阻塞读取的字节数;它不一定表示流已经结束。类似于:while((next=input.read())!=-1){byteArrayOutputStream.write(next);}byte[]data=byteArrayOutputStream.toByteArray()代码>我不能这样做。请给我完整的样品好吗?我按照你的建议试过了。字节[]数据=新字节[16384];ByteArrayOutputStream byteBuffer=新建ByteArrayOutputStream();当((nRead=input.read(data,0,data.length))!=-1{byteBuffer.write(data,0,nRead);byte[]dataOut=byteBuffer.toByteArray();客户端不停地循环发送数据,一段时间后,套接字全部读取并使客户端应用程序崩溃。InputStream in=null;重试{int next;ByteArrayOutputStream out=new ByteArrayOutputStream();while((next=in.read())!=-1){out.write(next);}byte[]data=out.toByteArray();}catch(IOException e){//handle error}
让我也试试你的代码。嗨,我应该使用ByteArrayOutputStream还是FileOutputStream?你用ByteArrayOutputStream添加了代码,但你提到了写入FileOutputStream?那么,我应该使用ByteArrayOutputStream还是FileOutputStream?问题是,它没有完全读取所有字节并从这个循环中出来。“While”循环在完成字节大小之前卡住。例如:如果客户端发送50K字节的图像数据,那么这个套接字“While”读取大约49K字节,之后它不会退出此循环,而是卡在循环本身中。发现一个奇怪的事情,当它在套接字中的“While”循环中读取时,如果我退出iOS客户端应用程序,那么套接字会突然获得完整的图像。因此,此套接字“While”循环不知怎的挂起了它。@Stella你的客户端没有关闭套接字。while()。