Java ReadableByteChannel.read()的行为

Java ReadableByteChannel.read()的行为,java,Java,如果在读取操作期间或在后续调用中达到EOF,read()是否返回-1?Java文档对此并不完全清楚,我正在读的书也不清楚 书中的以下代码正在读取一个文件,其中包含三种不同类型的重复值,一种是double,一种是长度可变的字符串,另一种是二进制长的。缓冲区应该填充在任何一个值中间的某个随机位置,代码将处理它。我不明白的是,如果在读取操作期间返回-1,最后的值将不会在prinf station中得到输出 try(ReadableByteChannel inCh=Files.newbytechcha

如果在读取操作期间或在后续调用中达到EOF,read()是否返回-1?Java文档对此并不完全清楚,我正在读的书也不清楚

书中的以下代码正在读取一个文件,其中包含三种不同类型的重复值,一种是double,一种是长度可变的字符串,另一种是二进制长的。缓冲区应该填充在任何一个值中间的某个随机位置,代码将处理它。我不明白的是,如果在读取操作期间返回-1,最后的值将不会在prinf station中得到输出

try(ReadableByteChannel inCh=Files.newbytechchannel(文件)){

ByteBuffer buf=ByteBuffer.allocateDirect(256);
buf.位置(buf.limit());
int strLength=0;
字节[]strChars=null;
while(true){
如果(剩余的buf()<8){
如果(英寸读数(buf.compact())=-1){
打破
}
buf.flip();
}
strLength=(int)buf.getDouble();
如果(剩余长度()<2*strLength){
如果(英寸读数(buf.compact())=-1){
System.err.println(“读取主字符串时发现EOF”);
打破
}
buf.flip();
}
strChars=新字节[2*strLength];
buf.get(strChars);

if(buf.remaining()我建议做一个简单的测试来了解它是如何工作的,如下所示

    ReadableByteChannel in = Files.newByteChannel(Paths.get("1.txt"));
    ByteBuffer b = ByteBuffer.allocate(100);
    System.out.println(in.read(b));
    System.out.println(in.read(b));
1.txt包含1个字节,测试打印

1
-1

如果在最后一次有效读取时返回-1,您将不知道您读取了多少数据…答案似乎是不言而喻的。
1
-1