【发布时间】:2011-12-13 15:11:06
【问题描述】:
我第二次遇到 InputStream 这个极其烦人的问题。 此 InputStream 属于应该接收图像的 Socket。读取这张图片的代码如下:
InputStream input = socket.getInputStream();
InputStreamReader reader = new InputStreamReader(input);
BufferedReader bufferedReader = new BufferedReader(reader);
int total = Integer.parseInt(bufferedReader.readLine());
int bytesRead = 0;
byte[] buffer = new byte[total]; // total is the total size of the image
while (bytesRead < total) {
int next = input.read(buffer, bytesRead, total-bytesRead);
if (next > 0) {
bytesRead += next;
System.out.println("Read: " + bytesRead);
}
}
现在奇怪的是,这段代码跳过了图像的前 1182 个字节,然后读取了剩下的部分。因此,当total 大小为 15000 字节时,它会读取 1182-15000 字节。
我检查了 Wireshark 并传输了整个图像。该代码不会引发异常。 input.read() 像往常一样返回 -1。
已使用BufferedReader 从流中读取了先前的数据。该数据只有 5 个字符长,因此它不能包含丢失的 1K,但我的猜测是 BufferedReader.readLine() 方法从 InputStream 读取(缓冲)的字节比需要的多。这可能是正确的吗?
几个月前我也遇到过同样的问题,但我完全不知道我是如何解决的。
希望任何人都可以提供帮助。
提前致谢。
编辑:我可以通过在发送图像大小和图像数据之间添加 100 毫秒的睡眠来解决这个问题。它解决了问题,但我仍然很想知道更合适的解决方案
【问题讨论】:
-
对我来说这听起来不太可能。流似乎更有可能真的包含数据。顺便说一句,您应该注意,如果您意外到达流的末尾,您将永远循环...您是否尝试过通过 Wireshark 查看网络数据?您是否对流进行了什么操作?
-
出于兴趣(类似于上面的问题);你怎么知道丢失的是 first 1182 个字节?
-
所以这就像
DataInput.readFully() -
Jon -- 如果他们到达流的末尾,我认为 next 将第一次设置为 -1,但是他们会得到一个 EOFException,不是吗?虽然我同意,但 next 是 -1 应该是循环的结束条件。
-
@thomaatje:如果是这样,问题的原因可能在于读取这些先前数据的代码。它以某种方式消耗了图像的开头。
标签: java sockets inputstream