0

从大文件中读取时,我从这段代码中得到了一些奇怪的输出,文件是使用 while 循环打印到 99,999 位的,但是,在读取文件并打印内容时,它只输出 99,988 行。另外,使用 ByteBuffer 是读取文件的唯一选择吗?我见过其他一些使用 CharBuffer 的代码,但我不确定应该使用哪一个,以及在什么情况下应该使用它们。注意:filePath 是指向磁盘上文件的 Path 对象。

    private void byteChannelTrial() throws Exception {
        try (FileChannel channel = (FileChannel) Files.newByteChannel(filePath, READ)) {
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            String encoding = System.getProperty("file.encoding");
            while (channel.read(buffer) != -1) {
                buffer.rewind();
                System.out.print(Charset.forName(encoding).decode(buffer));
                buffer.clear();
            }
        }
4

3 回答 3

2

通常,在读取缓冲区数据之前调用 flip()。rewind() 方法执行以下工作:

public final Buffer rewind() {
    position = 0;
    mark = -1;
    return this;
}

它没有像 flip() 那样设置“限制”:

public final Buffer flip() {
    limit = position;
    position = 0;
    mark = -1;
    return this;
}

因此,在阅读之前使用 flip() 而不是 rewind() 取一个托盘。

于 2013-03-25T08:45:19.727 回答
1

对于阅读文本 BufferedReader 是最好的

    try (BufferedReader rdr = Files.newBufferedReader(Paths.get("path"),
            Charset.defaultCharset())) {
        for (String line; (line = rdr.readLine()) != null;) {
            System.out.println(line);
        }
    }

顺便提一句

String encoding = System.getProperty("file.encoding");
Charset.forName(encoding);

相当于

Charset.defaultCharset();
于 2013-03-25T07:17:11.213 回答
0

好吧,事实证明这种组合有效:

    private void byteChannelTrial() throws Exception {
        try (FileChannel channel = (FileChannel) Files.newByteChannel(this.filePath, READ)) {
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            while (channel.read(buffer) != -1) {
                buffer.flip();
                System.out.print(Charset.defaultCharset().decode(buffer));
                buffer.clear();
            }
        }
    }

至于它为什么起作用,我不太确定。

于 2013-03-26T06:29:14.937 回答