java - InputStream 跳过字节

标签 java sockets inputstream

这是我第二次遇到 InputStream 这个极其烦人的问题。 此 InputStream 属于应该接收图像的套接字。读取这张图片的代码如下:

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 毫秒的 hibernate 来解决问题。它解决了问题,但我仍然很想知道更合适的解决方案

最佳答案

正如名称 **Buffererd**Reader 所表明的,它将从底层读取器中捕获比第一行更多的字节,因此也会从流中捕获更多的字节。否则 if 不会被称为“缓冲”。

不幸的是,我不知道 Java 中有任何未弃用的类允许以您想要的方式混合二进制和文本数据。

我建议您修改协议(protocol)并以某种二进制编码传输图像的长度。然后你可以坚持使用 InputStream

关于java - InputStream 跳过字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7867580/

相关文章:

java - 从 Cucumber Java 中的 Scenario outline 示例表中解析整数列表

java - 如何使用java读取位文件mpeg视频

linux - fuser 如何以非 root 用户身份报告套接字?

java - 无法获取 UTF-8 形式的 URL 内容

Java的InputStream会破坏信息,为什么?

java - 无法加载文件无法加载client_secrets.json

java - 在java中查找数字范围

java - 使用 md5 哈希密码 Smack 登录 Openfire

apache-flex - 第二个套接字发送上的沙箱违规

c - 连接被拒绝错误的原因可能是什么?