【发布时间】:2014-04-13 09:52:22
【问题描述】:
好的,这可能不是最好的问题,但我被它困住了,无法在网上找到答案。
此代码第二次不会从标准输入中读取:
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 被关闭。有什么好的解决方法吗?或者我真的应该自己处理流关闭吗?
更新: 我试图处理关闭自己的流(即 java6 风格)。如果有人感兴趣,这里是code。但是我注意到这种闭链行为不是来自资源尝试,而是来自于关闭方法的实现。所以我没有从那次尝试中赢得任何东西。
我选择 fge 的解决方案是因为它是最冗长的解决方案。它直接对我有用。
总而言之,我觉得很奇怪,java 没有开箱即用的解决方案,因为存在不应该关闭的系统流。
【问题讨论】:
-
您可以创建自己的
InputStream类,它不会关闭.close()上的底层资源;虽然这违反了.close()合同 -
或者你可以避免在这种情况下使用 try-with-resources,因为你不希望流被关闭,这就是 try-with-resources 所做的。
标签: java stream stdin try-with-resources