Java 如何在try with resources中正确使用OutputStream?
我有一段简单的代码,它的工作方式与我期望的不同:Java 如何在try with resources中正确使用OutputStream?,java,outputstream,Java,Outputstream,我有一段简单的代码,它的工作方式与我期望的不同: try (OutputStream ostr = new BufferedOutputStream(System.out)) { ostr.write("lol".getBytes()); } System.out.println("hmmm"); 结果只是 lol 打印,但不是hmm 我做错了什么?假设hmm没有被打印,因为ostr也关闭了System.out,我的假设
try (OutputStream ostr = new BufferedOutputStream(System.out)) {
ostr.write("lol".getBytes());
}
System.out.println("hmmm");
结果只是
lol
打印,但不是hmm
我做错了什么?假设
hmm
没有被打印,因为ostr
也关闭了System.out
,我的假设正确吗?我知道这是一个非常综合的示例,但我仍在等待答案。try构造在最后关闭了ostr
。关闭被传播到系统.out
。随后调用System.out.println(“hmmm”)
将给System.out带来麻烦,但不会引发异常。(这是PrintStream
s处理错误的奇怪方式。)尝试以下方法:
System.out.close();
System.out.println("hmmm");
System.err.println("System.out in trouble: " + System.out.checkError());
这将打印(通过仍然完整的System.err流):
嗯。。。我明白了,这真的很奇怪。实际上,我之所以要问这个问题,是因为Jackson的
mapper.writeValue(OutputStream,Object)
方法的一些意外行为。单次写入后,OutputStream
的实例似乎已关闭,无法进行进一步写入:在第一次调用write
时成功打印,并将错误设置为下一次调用的结果。对我来说似乎是一个糟糕的设计。至少它似乎是一个未被超越的默认行为。我只是在jacksonjavadoc中点击了一下,读到您需要一个JsonFactory来创建一个ObjectMapper。JsonFactory允许类似于jsonFactor.configure(JsonGenerator.Feature.AUTO\u CLOSE\u TARGET,false)
。这可能会解决意外的行为,但我没有尝试。是的,这对我来说也是一个选择,但是,在我看来,这种行为是一个奇怪的默认选择。是的,这很有效。再次感谢。
System.out in trouble: true