冲洗物体的正确位置

时间:2015-05-15 13:17:55

标签: java

我写了一小段代码用于打印:

        BufferedWriter out = null;
        try {
            out = new BufferedWriter(new OutputStreamWriter(
                    new FileOutputStream(FileDescriptor.out), "ASCII"), 512);
            out.write(msg + '\n');
            out.flush();
        } catch (UnsupportedEncodingException e) {

            throw new IllegalStateException(
                    "Test failed ",
                    e);
        } catch (IOException e) {

            throw new IllegalStateException(
                    "Test failed", e);
        } finally {
            if (out != null) {
                out = null;
            }
        }

仅在try块中刷新obj。那么它是一个很好的方法,或者我应该刷新finally块中的对象吗?

2 个答案:

答案 0 :(得分:4)

如果可以,请使用现代语法并且不要担心所有这些。关闭将自动刷新它,因此只需使用try-with-resources语法。此代码更短,更易读:

    try(BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
                new FileOutputStream(FileDescriptor.out), "ASCII"), 512)) {
        out.write(msg + '\n');
    } catch (UnsupportedEncodingException | IOException e) {
        logger.info("Test failed due to exception.");
        throw new IllegalStateException("Test failed", e);
    }

如果您不熟悉语法,请详细了解try-with-resources

答案 1 :(得分:1)

答案是“这取决于”。您何时希望文本可供阅读?如果您不需要任何可用于读取的文本(即没有其他进程在流上主动等待作为输入),那么在完成之前您不需要刷新流(在最后阻止)。但是你甚至不需要明确地这样做,因为关闭流会自动刷新它。

如果另一个进程正在等待流,那么只要您希望该输出可用于其他进程,就应该刷新。然而,刷新往往否定了缓冲的好处。

正如其他人所说,刷新和关闭流也会引发异常,因此这些操作也应该在他们自己的try / catch块中(静态实用程序方法可以帮助减少使用时的样板代码量)流)。