Java——如何从输入流(套接字/套接字服务器)中读取未知数量的字节?

新手上路,请多包涵

希望使用 inputStream 通过套接字读取一些字节。服务器发送的字节数可能是可变的,客户端事先并不知道字节数组的长度。如何做到这一点?


byte b[];
sock.getInputStream().read(b);

这会导致来自 Net BzEAnSZ 的“可能未初始化错误”。帮助。

原文由 farm ostrich 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 531
2 个回答

读取一个int,它是下一段正在接收的数据的大小。创建一个具有该大小的缓冲区,或使用一个宽敞的预先存在的缓冲区。读入缓冲区,确保它限制在预先读取的大小内。冲洗并重复 :)

如果您 真的 像您所说的那样事先不知道大小,请按照其他答案提到的那样阅读扩展的 ByteArrayOutputStream 。但是,尺寸法确实是最可靠的。

原文由 Chris Dennett 发布,翻译遵循 CC BY-SA 3.0 许可协议

您需要根据 需要 扩展缓冲区,通过读取字节块,一次读取 1024 个字节,就像我之前写的这个示例代码一样

    byte[] resultBuff = new byte[0];
    byte[] buff = new byte[1024];
    int k = -1;
    while((k = sock.getInputStream().read(buff, 0, buff.length)) > -1) {
        byte[] tbuff = new byte[resultBuff.length + k]; // temp buffer size = bytes already read + bytes last read
        System.arraycopy(resultBuff, 0, tbuff, 0, resultBuff.length); // copy previous bytes
        System.arraycopy(buff, 0, tbuff, resultBuff.length, k);  // copy current lot
        resultBuff = tbuff; // call the temp buffer as your result buff
    }
    System.out.println(resultBuff.length + " bytes read.");
    return resultBuff;

原文由 d-live 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题