2012-07-26 277 views
0

我正在尝试读取一个巨大的文件(> 1GB),我在考虑将它作为随缓冲读取器随机访问的文件读取会很有效。用缓冲读取器读取随机访问文件

我需要逐行读取文件中的行,并解析它

不过是对Java IO的API,我不知道我该怎么做..

我感谢你的帮助。

+0

您只能读取一个随机字节,而不是随机字符(因为它们可能会有所不同)您要做的是这些类不能很好地协同工作? – 2012-07-26 15:21:12

+0

你想做什么?你需要阅读整个文件吗?在文件中间以固定偏移量读取内容?阅读你在文件中间搜索的内容?你只是试图读取整个文件“更快”吗?问:你试图解决什么问题? – paulsm4 2012-07-26 15:23:39

+0

我需要逐行读取文件并解析它,我需要它尽可能快 – user1203861 2012-07-26 15:29:44

回答

3

您可以使用Java的的BufferedReader这个:

BufferedReader reader = new BufferedReader(new FileReader(fileName)); 
String line; 
while ((line = reader.readLine()) != null) { 
    // Do some stuff with the line 
} 

fileName是路径要读取的文件。

+1

请注意'FileReader'假定给定文件使用默认字符编码进行编码。否则无法告诉它。 – seh 2012-07-26 15:58:02

0

您是否需要阅读所有内容并从头开始?如果您知道可以从哪个字节开始,则可以使用RandomAccessFile跳转到文件的不同部分。我认为这是寻求功能。

+0

我不在乎在哪里开始,只要我结束阅读整个文件行 – user1203861 2012-07-26 16:23:38

+0

然后我瘦jayeff答案是你最好的选择 – RNJ 2012-07-26 16:39:43

-1

虽然在java中完全可行的,我想根据我的经验表明:

如果你在Unix平台上,你可以使用外部的shell脚本,通过日志的绿带搜索。 sed非常适合此目的。具体用法如下:http://www.grymoire.com/Unix/Sed.html

无论何时需要通过日志文件读取/ grep,通过java文件调用shell脚本。

如何?

1)在您的java代码中,使用ProcessBuilder类。它可以在shell脚本作为对Arg的构造器

ProcessBuilder obj = new ProcessBuilder("FastLogRead.sh");

2)过程

Process process = obj.start();

3)你可以通过这个阅读这个shell的输出,直接在BufferedRead创建对象

BufferedReader br=new BufferedReader(new InputStreamReader(process.getInputStream()));

优点:

通过平均加速执行。 10倍(我寻遍各地4GB的日志文件)

缺点:

一些开发商不喜欢引进轻量的shell脚本中的java的领域,因此想去Java的RandomAccessFile。这是有道理的。

对于您的情况,您可以选择标准化和性能。