Java BufferedReader的读取行不更改文件指针
我的应用程序逐行读取文本文件,并记录每行的偏移量,直到文件结束。首次执行readLine时,offset返回更改的值。但从那以后就再也没有变化了。我的代码有什么问题?我使用Java BufferedReader的读取行不更改文件指针,java,android,bufferedreader,randomaccessfile,Java,Android,Bufferedreader,Randomaccessfile,我的应用程序逐行读取文本文件,并记录每行的偏移量,直到文件结束。首次执行readLine时,offset返回更改的值。但从那以后就再也没有变化了。我的代码有什么问题?我使用RandomAccessFile而不是FileInputStream,因为当文件很大时,seek()比skip()快 String buffer; long offset; RandomAccessFile raf = new RandomAccessFile("data.txt", "r"); FileInp
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;
………………………………
}
因为
BufferedReader
已被缓冲。因此,它第一次将数据读入它的缓冲区,然后将其保持在那里,直到它需要更多的缓冲数据
如果您想使用较小的缓冲区进行测试,请尝试使用新的BufferedReader(new InputStreamReader(is),1000)代码>或者什么的。您的指针现在应该偶尔增加1000
如果你想让你的计数器正常工作,你可以做两件事中的一件。您可以对接收到的字符进行计数,然后将其转换为字节长度,以制作自己的计数器,也可以使用无缓冲的文件读取器
,以预期的方式递增计数器
更新:似乎
FileReader
在幕后做了一些事情。我会使用类似于newcountingInputStream(new BufferedInputStream)(new FileInputStream(raf.getFD())的东西)
以字节
的形式循环数据,手动识别行尾,同时将字节转储到字符串
。这不是最漂亮的方式,而是我能想到的给定读卡器内部缓冲的唯一方式。我认为CountingInputStream
是Apache免费提供的,它包含一个计数
方法或类似的方法。想想缓冲读取器会做什么。它会将一些文件读入“缓冲区”为了加快访问速度。我很高兴你对BufferedReader
buffers读取感到恼火。我理解,但我不知道如何更改我的代码。请链接BufferedReader的良好示例。出乎意料的是,即使我将BufferedReader的缓冲区大小更改为10,getFilePointer始终返回相同的值。好的。问题可能在于reader本身。我试过了,只是一个文件读取器不起作用,但InputStream起作用。我认为文件读取器在幕后进行了一些缓冲。请参阅我的最新编辑。我使用getBytes获取偏移量。尽管速度很慢,但仍能工作。谢谢。