如果在读取操作期间或后续调用中达到EOF,read()是否返回-1? Java文档在这方面并不完全清楚,我正在阅读的这本书也没有。
本书中的以下代码是读取一个文件,其中包含三种不同类型的值重复,一个double,一个长度不一的字符串和一个二进制long。缓冲区应该填充在任何值中间的某个随机位置,代码将处理它。我不明白的是,如果在读取操作期间返回,则在prinf语句中不会输出最后的值。
try(ReadableByteChannel inCh = Files.newByteChannel(file)) {
ByteBuffer buf = ByteBuffer.allocateDirect(256);
buf.position(buf.limit());
int strLength = 0;
byte[] strChars = null;
while(true) {
if(buf.remaining() < 8) {
if(inCh.read(buf.compact()) == -1) {
break;
}
buf.flip();
}
strLength = (int)buf.getDouble();
if (buf.remaining() < 2*strLength) {
if(inCh.read(buf.compact()) == -1) {
System.err.println("EOF found while reading the prime string.");
break;
}
buf.flip();
}
strChars = new byte[2*strLength];
buf.get(strChars);
if(buf.remaining() <8) {
if(inCh.read(buf.compact()) == -1) {
System.err.println("EOF found reading the binary prime value.");
break;
}
buf.flip();
}
System.out.printf("String length: %3s String: %-12s Binary Value: %3d%n",
strLength, ByteBuffer.wrap(strChars).asCharBuffer(), buf.getLong());
}
System.out.println("\n EOF Reached.");
答案 0 :(得分:1)
我建议做一个简单的测试来了解它是如何工作的,比如这个
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