好的,这里是一个可能不是最好的问题,但是我卡住了,找不到在网上的答案。
这段代码第二次不会从标准输入读取:
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in)))
{
input = br.readLine();
}
catch (final Exception e)
{
System.err.println("Read from STDIN failed: " + e.getMessage());
}
// do some processing
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in)))
{
input = br.readLine();
}
catch (final Exception e)
{
System.err.println("Read from STDIN failed: " + e.getMessage());
}
我知道Java的try-with-resources递归关闭链中的所有流,因此在第一次读取System.in后,System.in将被关闭。是否有好的解决方法?或者我真的需要自己处理流的关闭?
更新:我尝试手动处理流的关闭(这是Java6风格的)。如果有人感兴趣,这里是一个链接code。但我注意到这种链式关闭行为并不是来自try-with-resources,而是来自close方法的实现。所以我从那次尝试中没有获得任何好处。
我选择了fge的解决方案,因为它是最详细的。它直接为我工作了。
总的来说,我觉得很奇怪,Java没有这样的开箱即用的解决方案,因为有些系统流不应该被关闭。
InputStream
类,它不会在.close()
上关闭底层资源;尽管这违反了.close()
的契约。 - fge