我有一个Java扫描器的问题。我有一个方法解析System.in
和创建一个基于此数据的对象。但是如果我在方法中创建Scanner
,我有两种方法可以做到这一点,即关闭和不关闭。在第一种情况下,Scanner.close()
也关闭System.in
,否则它会提前缓冲,并且它缓冲的字符从另一个扫描器无法访问。所以现在我传递一个Scanner
实例到方法。但它不能是可靠的,如果你需要从控制台读取另一个对象,例如通过BufferedReader
。此外,这似乎不是一个真正干净的设计解决方案。
定义一个BufferedReader
并将其传递给您的方法。使用它将行读入字符串,并在其上附加Scanner
而不是System.in
。
我猜设计已经考虑到只有一个Reader
或Scanner
可以一次实际读取InputStream
(System.in
),因此在它上面有几个Reader
是无用的(因为它也消耗流),从而可以关闭底层的InputStream
。
编辑:一种解决方案是直接使用InputStream
(read()
)并自己处理字节读取。例如,String
具有构造函数String(byte[])
,您可以将其与substring()
一起使用,仅返回未使用的部分。