![](/img/trans.png)
[英]How do I read/write raw hex bytes from input/output stream in BluetoothChat?
[英]How do I read x bytes from a stream?
我想一次从Socket读取n个字节。 我怎样才能做到这一点?
当然它可以阻止任意长时间......
您可以创建一个辅助方法来完全填充缓冲区。 像这样的东西:
public int fillBufferCompletely(InputStream is, byte[] bytes) throws IOException {
int size = bytes.length;
int offset = 0;
while (offset < size) {
int read = is.read(bytes, offset, size - offset);
if (read == -1) {
if ( offset == 0 ) {
return -1;
} else {
return offset;
}
} else {
offset += read;
}
}
return size;
}
然后你只需要传入一个大小为x
的缓冲区。
迈克尔发布了一个功能的链接,该功能基本上是相同的。 与我的唯一区别是它确实能够返回小于缓冲区长度,但仅限于流末尾的条件。 DataInputStream.readFully
会在此方案中引发运行时异常。
所以我会留下我的答案以防万一这种行为的例子很有用。
MarkInputStream.readFully()在EOF上引发异常,正如Mark Peters指出的那样。 但还有另外两种方法:Commons IO的IOUtils.read()和Guavas ByteStreams.read () 。 这两个都尝试读取最多N个字节,仅在EOF停止,并返回它们实际读取的数量。
这是不可能的。 底层平台无法保证这一点,因此Java也无法保证。 您可以尝试读取n个字节,但是您必须准备好比请求的更少。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.