为了处理日志,我的应用需要逐行读取文本文件。
起初我使用了BufferedReader的readLine()函数,但在互联网上看到它读取文件时速度较慢。
后来我尝试使用FileInputStream与FileChannel和MappedByteBuffer一起使用,但这种情况下没有类似于readLine()的函数,所以我需要搜索换行符并进行处理:
try {
FileInputStream f = new FileInputStream(file);
FileChannel ch = f.getChannel( );
MappedByteBuffer mb = ch.map(FileChannel.MapMode.READ_ONLY, 0L, ch.size());
byte[] bytes = new byte[1024];
int i = 0;
while (mb.hasRemaining()) {
byte get = mb.get();
if(get == '\n') {
if(ra.run(new String(bytes)))
cnt++;
for(int j = 0; j<=i; j++)
bytes[j] = 0;
i = 0;
}
else
bytes[i++] = get;
}
} catch(Exception ex) {
ex.printStackTrace();
}
我知道这可能不是实现它的好方法,但是当我只是以字节读取文本文件时,它比使用BufferedReader快3倍,但调用
new String(bytes)
会创建一个新的字符串,并使程序比使用BufferedReader还要慢。因此,我想问一下,逐行读取文本文件的最快方法是什么? 有人说BufferedReader是解决此问题的唯一方法。
附注:
ra
是dk.brics.Automaton库中RunAutomaton的实例。
BufferedReader
对于您的应用程序来说真的太慢了,那么您应该考虑不使用Java或其他托管语言...(但我怀疑这是否是情况) - ordag