Java -- 如何从 inputStream(套接字/套接字服务器)读取未知数量的字节?

2022-09-02 11:14:01

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


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

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


答案 1

您需要根据需要扩展缓冲区,通过以字节块为单位读取,一次读取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;

答案 2

假设发送方在数据结束时关闭流:

ByteArrayOutputStream baos = new ByteArrayOutputStream();

byte[] buf = new byte[4096];
while(true) {
  int n = is.read(buf);
  if( n < 0 ) break;
  baos.write(buf,0,n);
}

byte data[] = baos.toByteArray();

推荐