2009-08-26 174 views
7

我用扫描仪读取一行文本文件中的行,但再怎么弄,因为每个通过扫描仪输入迭代行数得到的行号我的计划是这样的:?如何使用扫描仪

s = new Scanner(new BufferedReader(new FileReader("input.txt"))); 

while (s.hasNext()) { 
System.out.print(s.next()); 

这工作得很好,但例如:

 
1,2,3 
3,4,5 

我想知道它的行号这意味着1,2,3是1号线与3,4,5是符合2.How我拿到?

回答

16

您可以使用LineNumberReader代替BufferedReader,以便在扫描仪执行任务时跟踪行号。

LineNumberReader r = new LineNumberReader(new FileReader("input.txt")); 
String l; 

while ((l = r.readLine()) != null) { 
    Scanner s = new Scanner(l); 

    while (s.hasNext()) { 
     System.out.println("Line " + r.getLineNumber() + ": " + s.next()); 
    } 
} 

注:作为扫描器读取领先于当前令牌的“明显”的解决方案,我先贴不起作用。

r = new LineNumberReader(new FileReader("input.txt")); 
s = new Scanner(r); 

while (s.hasNext()) { 
    System.out.println("Line " + r.getLineNumber() + ": " + s.next()); 
} 

+0

可惜仍然没有比创建每行一个扫描仪,但更好的解决方案。我偶然发现了与第一个“天真”解决方案相同的问题,扫描仪读取得太多,似乎没有办法设置更小的缓冲区。 – Joffrey 2017-03-21 01:35:38

9

只要把计数器的循环:

s = new Scanner(new BufferedReader(new FileReader("input.txt"))); 

for (int lineNum=1; s.hasNext(); lineNum++) { 
    System.out.print("Line number " + lineNum + ": " + s.next()); 
} 
+2

我认为这只有在.useDelimiter()设置为换行时才有效。如果您扫描空格(例如单词)而不是单词计数单词。 – Roalt 2010-09-22 12:32:22

+1

我更新了示例以使用hasNextLine/nextLine,以便解决OP的问题。 – 2011-12-30 04:13:57

+0

真的很简单,而且有效! – tiboo 2012-08-17 07:43:03