BufferedReader的readLine不会更改文件指针

时间:2015-01-28 06:36:50

标签: java android bufferedreader randomaccessfile

我的应用程序逐行读取文本文件并记录每行的偏移量,直到文件末尾。首次执行readLine时,offset返回更改的值。但在此之后它不再发生变化。我的代码出了什么问题?我使用RandomAccessFile而不是FileInputStream,因为当文件很大时,seek()比skip()更快。

String buffer;        
long offset;
RandomAccessFile raf = new RandomAccessFile("data.txt", "r");
FileInputStream is = new FileInputStream(raf.getFD());
BufferedReader br = new BufferedReader(new InputStreamReader(is));

while (true) {
    offset = raf.getFilePointer(); // offset remains the same after 1st readLine. why?
    if ((buffer = br.readLine()) == null) // buffer has correct value.
        return;
………………………………
}

1 个答案:

答案 0 :(得分:0)

因为BufferedReader是缓冲的。所以它第一次将数据读入缓冲区,然后将其保留在那里直到需要更多缓冲数据。

如果您想使用较小的缓冲区进行测试,请尝试使用new BufferedReader(new InputStreamReader(is), 1000);或其他内容。你的指针现在应该偶尔增加1000。

如果您希望计数器正常工作,您可以执行以下两种操作之一。要么你可以计算你正在接收的字符,然后做一些转换为字节长度你可以用来制作你自己的计数器,或者你可以使用没有缓冲的FileReader,这会以你期望的方式递增计数器。 / p>

更新:似乎FileReader在幕后做了些什么。我使用new CountingInputStream(new BufferedInputStream(new FileInputStream(raf.getFD()))之类的东西循环遍历byte形式的数据,手动识别行结尾,同时将字节转储到String。这不是最漂亮的方式,但是考虑到Reader的内部缓冲,我能想到的唯一方法。我认为CountingInputStream是由Apache自由提供的,它包含count方法或类似的东西。