在不关闭的情况下始终重新初始化 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
,这样就不会发生这种情况。
以下方法总是在每次打印后创建一个新的 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
,这样就不会发生这种情况。