我目前有两个BufferedReader
对象,它们都初始化在同一个文本文件上。当我使用第一个BufferedReader
读完这个文本文件后,我需要使用第二个BufferedReader
从头再次对这个文件进行读取。多次从同一文件中读取数据是必要的。
我知道有reset()
方法,但是在使用之前需要调用mark()
方法,并且mark()
方法需要知道文件的大小,这是我认为不必要的。
有什么想法吗? 包? 库? 代码?
谢谢 TJ
我目前有两个BufferedReader
对象,它们都初始化在同一个文本文件上。当我使用第一个BufferedReader
读完这个文本文件后,我需要使用第二个BufferedReader
从头再次对这个文件进行读取。多次从同一文件中读取数据是必要的。
我知道有reset()
方法,但是在使用之前需要调用mark()
方法,并且mark()
方法需要知道文件的大小,这是我认为不必要的。
有什么想法吗? 包? 库? 代码?
谢谢 TJ
缓冲读取器适用于按顺序读取文件。您需要使用java.io.RandomAccessFile,然后可以使用seek()
将您带到文件中想要的位置。
随机访问读取器的实现方式如下:
try{
String fileName = "c:/myraffile.txt";
File file = new File(fileName);
RandomAccessFile raf = new RandomAccessFile(file, "rw");
raf.readChar();
raf.seek(0);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
"rw"
是一种模式字符,详细介绍了该字符的用法。
顺序访问读取器设置成这样是为了让它们实现缓冲,并且防止在其操作下改变数据。例如,给缓冲读取器的文件读取器只能由该缓冲读取器操作。如果还有其他位置可以影响它,则可能会导致不一致的操作,因为一个读取器在文件读取器中推进其位置,而另一个读取器希望其位置保持不变。现在使用另一个读取器时,该读取器处于一个不确定的位置。
单纯创建一个新的 BufferedReader
来从文件顶部读取有什么缺点吗?如果文件足够小,我会期望操作系统会缓存文件。
如果你担心性能问题,你是否已经证明它成为瓶颈了呢?我会选择最简单的方式来做,并且在有具体原因之前不去担心它。我的意思是,你可以将整个文件读入内存,然后对结果进行两遍操作,但这比只是用新的阅读器从开头再次读取要复杂一些。
最好的方法是改变你的算法,以一种不需要第二遍扫描的方式。当我需要处理巨大的文件(但不是非常可怕,即几GB)而内存不足时,我曾经使用过这种方法。
这可能很难,但性能的提升通常值得努力。