【问题标题】:Java: checkError() for PrintWriter(OutputStreamWriter(System.out))Java:PrintWriter(OutputStreamWriter(System.out)) 的 checkError()
【发布时间】:2012-10-17 08:18:13
【问题描述】:

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

PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out, ENCODING));
所以
out.format("一些文本");

在编码方面工作得很好。但是

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

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

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

和 checkError() 这门课效果很好。

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

【问题讨论】:

  • 预期的结果是什么?你想达到什么目的?
  • head 命令没有关闭输出流。只有你可以关闭它。

标签: java


【解决方案1】:

不,我也认为这不是错误,而是源于 checkError() 及其底层类的细微不同的定义/设计:

  • PrintWriter.checkError():

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

  • 来自PrintStream.checkError()

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

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

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

chcp 65001

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

【讨论】:

    猜你喜欢
    • 2018-11-29
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    相关资源
    最近更新 更多