2017-04-07 157 views
0

为什么我无法读取使用第二个Scanner实例的第二行?我得到一个“java.util.NoSuchElementException:找不到行”。java.util.Scanner第二个实例抛出NoSuchElementException

我知道我应该使用hasNextLine()并避免了例外,但我的问题是为什么第二行不可用?此外,有多个扫描程序实例的原因是因为实际上,扫描程序正在被多次调用的方法中实例化,并且我没有在那里寻找解决方案或修复程序。

请注意,我没有关闭扫描仪或流。我每次只使用扫描仪读取1行,而我在流中有3行。

下面是我的程序简化:

private void scanLines() { 
    String input = "Line 1." + System.lineSeparator() 
       + "Line 2." + System.lineSeparator() 
       + "Line 3." + System.lineSeparator(); 

    ByteArrayInputStream bais = new ByteArrayInputStream(input.getBytes()); 

    Scanner scanner1 = new Scanner(bais); 
    System.out.println(scanner1.nextLine()); 

    Scanner scanner2 = new Scanner(bais); 
    System.out.println(scanner2.nextLine()); 
} 

输出是:

Line 1. 
Exception in thread "main" java.util.NoSuchElementException: No line found 
     at java.util.Scanner.nextLine(Unknown Source) 
     at ScannerTest.scanLines(ScannerTest.java:23) 
     at ScannerTest.main(ScannerTest.java:6) 
+2

千万不要在同一个流上使用两个扫描器 – freedev

+1

为什么当你想读取字符串行时使用ByteArrayInputStream ?! – GhostCat

+0

只需使用相同的扫描器 – Hackerman

回答

0

使用多台扫描仪(在同一数据流)是一个非常不好的做法,因为扫描仪消耗他们共享流。

这是您例外的原因java.util.NoSuchElementException: No line found

我测试过你的代码,并且第二个nextLine()调用引发异常。

在每个Scanner类中保存对相同输入流的引用。

scanner1.nextLine()方法被调用时,读取流中的一串字节并且位置向前移动。

为了清楚起见,我仔细检查了调试Scanner类的源代码。

nextLine()方法被调用时,幕后的流向前迈进的1024位置复制结果到缓冲区

// Internal buffer used to hold input 
private CharBuffer buf; 

尝试自己调试Java源代码,并期待在方法readInput()

+0

谢谢!有关于此的任何文档/ javadocs? – Jay

+0

是的,流的位置向前移动,但应该向前移动1行,不会消耗整个流。 – Jay

+0

你忘了有一个基本的缓冲区...也许我错了... – freedev

相关问题