尝试更改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案例是一个错误,还是我错过了什么?
答案 0 :(得分:0)
不,我也认为这不是一个错误,而是根源于checkError()
及其基础类的微妙不同的定义/设计:
public boolean checkError()
如果流未关闭,则刷新流并检查其错误状态。 如果打印流在基础输出流上或格式转换期间遇到错误,则返回true
。
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/592355,https://stackoverflow.com/a/10148976/592355,...)