Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BufferedReader的读取行不更改文件指针_Java_Android_Bufferedreader_Randomaccessfile - Fatal编程技术网

Java BufferedReader的读取行不更改文件指针

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

我的应用程序逐行读取文本文件,并记录每行的偏移量,直到文件结束。首次执行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;
………………………………
}

因为
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获取偏移量。尽管速度很慢,但仍能工作。谢谢。