为什么FileChannel的position()方法总是返回零?

时间:2015-01-25 13:47:01

标签: java bufferedreader filechannel

我的应用程序逐行读取文本文件并记录每行的偏移量,直到文件末尾。 但是position()总是返回0。 我的代码出了什么问题?

String buffer;
long offset;
RandomAccessFile raf = new RandomAccessFile("data.txt", "r");
FileChannel channel = raf.getChannel();
BufferedReader br = new BufferedReader(new InputStreamReader(Channels.newInputStream(channel)));

while (true) {
    offset = channel.position(); // offset is always 0. why?
    if ((buffer = br.readLine()) == null) // buffer has correct value.
        return;
    ………………………………
}

1 个答案:

答案 0 :(得分:0)

我无法重现您的错误,也就是说,当我运行您的代码时,偏移量并不总是0。尽管如此,它并没有按照你的预期去做。您在BufferedReader之上创建了FileChannelBufferedReader将填充其缓冲区(从而增加通道中的偏移量),然后从缓冲区读取直到其为空。所以在调用br.readLine()一次之后,偏移量不是你读过的字符串的长度,它是缓冲区的长度。

您可以更好地直接使用BufferedReaderFileInputStream,并通过其他方式计算字符数。