我的应用程序逐行读取文本文件并记录每行的偏移量,直到文件末尾。首次执行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;
………………………………
}
答案 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
方法或类似的东西。