Java:printWriter的checkError()(OutputStreamWriter(System.out))

时间:2012-10-17 08:18:14

标签: java

尝试更改System.out的编码,我创建了一个PrintWriter       

PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out, ENCODING));
所以

out.format("some text");

编码工作正常。但是

out.checkError()
没有返回true 当输出流关闭时,例如通过Unix'head'命令。

我发现PrintStream提供了一个带编码的构造函数

PrintStream out = new PrintStream(System.out, true, ENCODING);

和checkError() 为这堂课做得很好。

我怀疑PrintWriter案例是一个错误,还是我错过了什么?

1 个答案:

答案 0 :(得分:0)

不,我也认为这不是一个错误,而是根源于checkError()及其基础类的微妙不同的定义/设计:

  • PrintWriter.checkError()

      

    public boolean checkError()   如果流未关闭,则刷新流并检查其错误状态。   如果打印流在基础输出流上或格式转换期间遇到错误,则返回true

  • PrintStream.checkError()

      

    public boolean checkError()刷新流并检查其错误状态。当基础输出流抛出true而不是IOException时,以及调用InterruptedIOException方法时,内部错误状态将设置为setError。如果基础输出流上的操作抛出InterruptedIOException,则PrintStream通过执行以下操作将异常转换回中断:    Thread.currentThread().interrupt();   或等同物。   返回:   true当且仅当此流遇到IOException以外的InterruptedIOException,或者setError方法已被调用。

如您所见PrintStream' checkError()定义更严格,失败可能仍值得调查。

然后很大程度上取决于您的实际输出控制台(以及它支持的编码)。在Windows中,您需要

chcp 65001

..启用(例如)UTF-8输出。(https://stackoverflow.com/a/388500/592355https://stackoverflow.com/a/10148976/592355,...)