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

Java 为什么FileChannel的position()方法总是返回零?,java,bufferedreader,filechannel,Java,Bufferedreader,Filechannel,我的应用程序逐行读取文本文件,并记录每行的偏移量,直到文件结束。 但位置总是返回0。 我的代码有什么问题 String buffer; long offset; RandomAccessFile raf = new RandomAccessFile("data.txt", "r"); FileChannel channel = raf.getChannel(); BufferedReader br = new BufferedReader(new InputStreamReader(Channe

我的应用程序逐行读取文本文件,并记录每行的偏移量,直到文件结束。 但位置总是返回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;
    ………………………………
}

我无法重现您的错误,也就是说,当我运行代码时,偏移量并不总是0。不过,它并没有达到你期望的效果。您可以在文件通道的顶部创建一个BufferedReader。BufferedReader将填充其缓冲区,从而增加通道中的偏移量,然后从缓冲区读取,直到其为空。因此,在调用br.readLine一次之后,偏移量不是您读取的字符串的长度,而是缓冲区的长度


您可以更好地直接使用BufferedReader和FileInputStream,并通过其他方式对字符进行计数

如果您想要一个InputStream,为什么不直接使用FileInputStream呢?这至少可能比获取文件通道并将其包装到InputStream中更有效。你是对的。它在第一次读取后更新一次。但它从不更新。我使用getBytes获取偏移量。它起作用了。非常感谢。