Java 冲洗对象的正确位置

Java 冲洗对象的正确位置,java,Java,我已经编写了一小段用于打印的代码: BufferedWriter out = null; try { out = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(FileDescriptor.out), "ASCII"), 512); out.write(msg + '\n');

我已经编写了一小段用于打印的代码:

        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;
            }
        }
obj的冲洗仅在试块中进行。那么,这是一种很好的方法,还是应该在finally块中刷新对象?

答案是“视情况而定”。您希望文本什么时候可以阅读?如果您不需要任何文本可供读取(即,没有其他进程正在流上积极等待作为输入),那么您不需要刷新流,直到您完成它(在finally块中)。但是您甚至不需要显式地这样做,因为关闭流会自动刷新它

如果另一个进程正在等待该流,那么您应该在希望该输出可供另一个进程使用时进行刷新。然而,刷新太频繁会否定缓冲的好处

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

答案是“视情况而定”。您希望文本何时可供阅读?如果您不需要任何文本可供读取(即,没有其他进程正在流上积极等待作为输入),那么您不需要刷新流,直到您完成它(在finally块中)。但是您甚至不需要显式地这样做,因为关闭流会自动刷新它

如果另一个进程正在等待该流,那么您应该在希望该输出可供另一个进程使用时进行刷新。然而,刷新太频繁会否定缓冲的好处


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

如果可以,请使用现代语法,不要担心所有这些。关闭将自动刷新它,所以只需使用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语法。此代码更短,可读性更强:

    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);
    }

如果您不熟悉语法,请参阅更多

我通常更喜欢,就在关闭writer/stream之前。我相信有人会对此有更多的了解。使用
out.close()
而不是
out=null
out.close()
缺失。你有什么具体的原因吗?我想他错写了
out=null
而不是
out.close()
没有当你
close
一个输出流时,它在未来任何时候都无法写入。但是将
null
赋值给
out
意味着
BufferedWriter
的实例仍然存在,并且能够向输出写入垃圾。我通常更喜欢在关闭writer/流之前。我相信有人会对此有更多的了解。使用
out.close()
而不是
out=null
out.close()
缺失。你有什么具体的原因吗?我想他错写了
out=null
而不是
out.close()
没有当你
close
一个输出流时,它在未来任何时候都无法写入。但是将
null
赋值给
out
意味着
BufferedWriter
的实例仍然存在,并且能够向输出写入垃圾。是真的需要在try块中刷新还是只能在finally块中完成?关闭将自动刷新。如果使用try/with语法,将为您处理关闭。所以,除非您有理由手动刷新,否则没有必要。是真的需要在try块中刷新,还是只能在finally块中完成?关闭将自动刷新。如果使用try/with语法,将为您处理关闭。因此,除非您有理由手动刷新,否则没有必要。