2

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

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

out.format("一些文本");

编码工作得很好。但

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

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

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

并且 checkError() 对这个类工作得很好。

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

4

1 回答 1

0

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

  • PrintWriter.checkError()

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

  • 并来自PrintStream.checkError()

    public boolean checkError()刷新流并检查其错误状态。内部错误状态设置为true当底层输出流抛出非IOExceptionInterruptedIOException以及setError调用方法时。如果对底层输出流的操作抛出InterruptedIOException,则通过执行PrintStream将异常转换回中断: Thread.currentThread().interrupt(); 或等效项。返回: true当且仅当此流遇到IOExceptionInterruptedIOException,或setError方法已被调用。

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

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

chcp 65001

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

于 2015-04-27T22:24:57.917 回答