希望使用 inputStream 通过套接字读取一些字节。服务器发送的字节数可能是可变的,客户端事先并不知道字节数组的长度。如何做到这一点?
byte b[];
sock.getInputStream().read(b);
这会导致来自 Net BzEAnSZ 的“可能未初始化错误”。帮助。
原文由 farm ostrich 发布,翻译遵循 CC BY-SA 4.0 许可协议
希望使用 inputStream 通过套接字读取一些字节。服务器发送的字节数可能是可变的,客户端事先并不知道字节数组的长度。如何做到这一点?
byte b[];
sock.getInputStream().read(b);
这会导致来自 Net BzEAnSZ 的“可能未初始化错误”。帮助。
原文由 farm ostrich 发布,翻译遵循 CC BY-SA 4.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 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
读取一个int,它是下一段正在接收的数据的大小。创建一个具有该大小的缓冲区,或使用一个宽敞的预先存在的缓冲区。读入缓冲区,确保它限制在预先读取的大小内。冲洗并重复 :)
如果您 真的 像您所说的那样事先不知道大小,请按照其他答案提到的那样阅读扩展的 ByteArrayOutputStream 。但是,尺寸法确实是最可靠的。