gpt4 book ai didi

java - 在 System.out 上同步

转载 作者:搜寻专家 更新时间:2023-10-31 08:22:49 24 4
gpt4 key购买 nike

我通过调用 System.setOutSystem.setErrSystem.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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com