2012-04-23 52 views
0

对于处理searchlog文件我正在写应阅读和线处理文件内容行的Java类。Java的阅读文本行无行分隔符

在日志文件文本类似于以下

[Integer User ID] [Queury] [Date: YYYY-MM-DD HH:MM:SS] [optional url] 

我尝试使用扫描仪和阅读与nextLine()线,但这读取整个文件作为一行。任何想法如何我可以确保一次只得到一条线?

回答

2

你可以只抓住了整个文件你拥有了它,然后拆分数据:

for (String line : "the entire file".split(System.getProperty("line.separator")) 
{ 
    System.out.println(line); 
} 

作为一个方面说明:System.getProperty("line.separator")是通用新行字符。

的另一种方法:

BufferedReader bufferedReader = new BufferedReader(new FileReader("absolute file path")); 

String line; 

while ((line = bufferedReader.readLine()) != null) 
{ 
    System.out.println(line); 
} 
+2

日志文件通常很大,一次加载到内存中。不仅如此,而且.split会导致分配两倍! – 2012-04-23 18:32:44

+0

差不多就是费尔明·席尔瓦说,我们正在谈论212mb txt文件在这里 – Rickyfox 2012-04-23 18:36:42

+0

@Rickyfox我添加使用BufferedReader类的第二种方法。 – 2012-04-23 18:37:43

3

尝试使用BufferedReader代替ScannerBufferedReader可容忍各种不同类型的线路终端 - 有可能Scanner总是期望您的平台默认线路终端。

另外,使用Guava它可以让你做到这一点真的很容易,例如与CharStreams.readLines,可能指定LineProcessor

+0

如果我还记得它的权利我想BufferedReader中时有同样的问题,但我会仔细检查它 – Rickyfox 2012-04-23 18:35:09

+0

@Rickyfox:那么,如果你做到了,那就表明你”或者没有正确读取文件(编码问题?)或者文件有奇数行结尾。 *文件在哪个编码中? – 2012-04-23 18:38:36

+0

工作,我只是很愚蠢:/ – Rickyfox 2012-04-23 18:50:04