我通过调用 System.setOut
和 System.setErr
将 System.out
更改为打印到文件。
每天午夜,我们要重命名(存档)当前日志文件,并创建一个新文件。
if (out != null) {
out.close();
out = null;
File f = new File(outputfilename);
f.renameTo(new File(dir.getPath().replace(".log", "-" + System.currentTimeMillis() + ".log")))
StartLogFile();
}
StartLogFile()
:
if (out == null) {
out = new FileOutputStream(outputfilename, true);
System.setOut(new PrintStream(out));
System.setErr(new PrintStream(out));
}
我没有处理异常。
我担心的是,如果有什么东西试图在 out.close()
和 setOut
/setErr
之间打印,我将错过一个日志。
我真正的问题是,我怎样才能使这个与对 System.out.println
的其他调用成为原子?
我正在考虑尝试
synchronized (System.out) {
}
但实际上我不确定这里的内在锁是否有任何作用。特别是因为我在操作期间使 out 对象无效。
有谁知道我如何确保此处正确同步?
最佳答案
我会在关闭旧的之前创建新的:
PrintStream old = System.out;
out = new FileOutputStream(outputfilename, true);
System.setOut(new PrintStream(out));
old.close();
这样,旧的 PrintStream
在创建并分配新的之前不会关闭。 System.out 中始终存在有效的 PrintStream
。
不需要synchronized
block ,因为一切都在同一个线程中。
关于java - 在 System.out 上同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23996666/