Java NIO:读取可变大小的块

Mar*_*wis 3 java buffer nio

我想从TCP流中读取一个字符串,该字符串长度后跟实际数据.在Python中,我会这样做

length = ord(stream.read(1))
data = stream.read(length)
Run Code Online (Sandbox Code Playgroud)

我如何在Java NIO中做同样的事情?我有一个缓冲区(容量257)

stream.read(buffer); // cannot specify a size here
int length = buffer.get();
byte[] data = new byte[length];
buffer.get(data);
Run Code Online (Sandbox Code Playgroud)

不幸的是,这并不工作:的get()调用read 过去在缓冲区中的数据:-(

我可能需要翻转,倒带,重置等组合,但我无法弄明白.

Bkk*_*rad 5

如果stream是a SocketChannel并且buffer是a ByteBuffer,您可以执行以下操作:

//assuming buffer is a ByteBuffer
buffer.position(0);
buffer.limit(1);
while (buffer.hasRemaining()) { 
   stream.read(buffer);
}
buffer.rewind();

//get the byte and cast it into the range 0-255
int length = buffer.get() & 0xFF;
buffer.clear();
buffer.limit(length);
while (buffer.hasRemaining()) { 
   stream.read(buffer);
}
buffer.rewind();
//the buffer is now ready for reading the data from
Run Code Online (Sandbox Code Playgroud)