0

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

本书中的以下代码正在读取具有三种不同类型的重复值的文件,一个双精度值,一个可变长度的字符串和一个二进制长整数。缓冲区应该填充在任何值中间的某个随机位置,代码将处理它。我不明白的是,如果在读取操作期间返回 -1 ,则最后一个值不会在 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.");
4

1 回答 1

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
于 2013-02-14T03:25:56.867 回答