当我执行以下课程时

import java.io.*;
import java.nio.*;
import java.nio.file.*;
import java.nio.channels.*;

public class FileChannelTest {
    public static void main(final String... args) throws IOException {
        final File file = File.createTempFile("temp", null);
        file.deleteOnExit();
        // write some
        try(OutputStream output = new FileOutputStream(file)) {
            output.write(new byte[128]);
            output.flush();
        }
        System.out.println("length: " + file.length());
        // read to end
        try(FileChannel channel
            = FileChannel.open(file.toPath(), StandardOpenOption.READ)) {
            final ByteBuffer buffer = ByteBuffer.allocate(128);
            for(int read; (read = channel.read(buffer)) != -1; ) {
                System.out.println("read: " + read);
            }
        }
    }
}


阅读循环永无止境。

$ java -version
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
$ java FileChannelTest.java
$ java FileChannelTest
length: 128
read: 128
read: 0
read: 0
read: 0
...
...
...


FileChannel.read(ByteBuffer)说,


  从该通道读取字节序列到给定的缓冲区。
  从该通道的当前文件位置开始读取字节,然后使用实际读取的字节数更新文件位置。否则,此方法的行为与ReadableByteChannel接口中指定的行为完全相同。


否则是什么意思?

最佳答案

当您读取ByteBuffer时,它只能读取缓冲区中可用的字节数,即byteBuffer.remaining()这意味着一旦缓冲区已满,则在读取时将返回0

如果您消耗了所有读取的数据,则建议您使用clear(),或者如果仅消耗了一部分读取的数据,则建议使用compact()

      for(int read; (read = channel.read(buffer)) != -1; ) {
            System.out.println("read: " + read);
            buffer.clear(); // so we can read more data
      }

关于java - 为什么FileChannel读不完?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34817945/

10-11 15:19