在不关闭的情况下始终重新初始化 PrintWriter 是个好主意吗?

Good idea to always reinitialize PrintWriter without closing?

以下方法总是在每次打印后创建一个新的 PrintWriter:

public class ConsoleInput implements Runnable {
    @Override
    public void run() {
        Scanner scan = new Scanner(System.in);
        while (true) {
            String msg = scan.nextLine();
            PrintWriter w = new PrintWriter(new OutputStreamWriter(App.serverProcess.getOutputStream()));
            w.println(msg);
            w.flush();
        }
    }
}

问题:serverProcess有时会刷新,所以我无法在无限循环之前初始化PrintWriter,因为它无法指向新的serverProcess 然后对象。

有什么解决办法吗?或者这是常见的做法?如果垃圾收集器清理旧的印刷机会怎样?它会调用 "close" 并弄乱我的应用程序吗?

更新: 下面的代码非常丑陋,但是它减少了垃圾对象。

public class ConsoleInput implements Runnable {

    Process sProcess;

    @Override
    public void run() {
        Scanner scan = new Scanner(System.in);
        this.sProcess = App.serverProcess;
        PrintWriter w = new PrintWriter(new OutputStreamWriter(App.serverProcess.getOutputStream()));
        while (true) {
            String msg = scan.nextLine();
            if (!sProcess.equals(App.serverProcess)) {
                sProcess = App.serverProcess;
                w = new PrintWriter(new OutputStreamWriter(App.serverProcess.getOutputStream()));
            }
            w.println(msg);
            w.flush();
        }
    }
}

垃圾收集器不会自动关闭 PrintWriters,因此您可以放心。此外,PrintWriter 和 OutputStreamWriters 不占用系统资源,因此不会发生资源泄漏。该程序将正常运行,尽管它会产生垃圾供 GC 处理。

不过有一点要记住。如果 serverProcess 在创建 PrintWriter 之后但在刷新消息之前刷新,则消息可能会写入旧 serverProcess 的输出流。如果在发生这种情况时旧输出流已关闭,您可能会得到 IOException.

您需要将此循环与任何刷新同步 serverProcess,这样就不会发生这种情况。