java - 在 System.out 上同步

标签 java file synchronization

我通过调用 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/

相关文章:

c - 多进程多线程的同步问题

javascript - 如何在node js中同步执行循环

javascript - Froala 编辑器 - 自定义对话框

Ruby IO - 间接文件输入/输出

php - 使用 PHP 下载文件。如何获取文件名?

c++ - 如果 pthread_cond_signal 是线程中的最后一次调用,是否存在数据竞争?

java - 无法使用 Spring Security 配置无状态和有状态 http 部分..?

java - Spring Data JPA 应用排序、分页和 where 子句

java - Spring事务管理: using @Transactional vs using AOP (<aop:advisor)

java - 如何在JAVA中循环读取文件中固定数量的字节?