ReadableByteChannel.read()的行为

时间:2013-02-14 00:50:57

标签: java

如果在读取操作期间或后续调用中达到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.");

1 个答案:

答案 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