方思永江
2021-04-08 10:49
采纳率: 100%
浏览 62
已采纳

Java如何保证对文件的写操作在其他代码执行前完成?

public class SelfLogger {
    private static Logger logger;
    static {
        // 对log4j的配置文件进行输出路径的写操作
        UserFile.setLogFilePath();
        
        // 返回logger对象
        logger = LogManager.getLogger(SelfLogger.class);
    }
    public static Logger getLogger() {
        return logger;
    }
}

配置文件的写操作代码

public static void setLogFilePath() {
        // 将根目录中的\ 替换成\\
        String rootPath = PathUtil.ROOT_PATH;
        String outPath = PathUtil.OUT_PATH;
        outPath = outPath.replace("\\","\\\\");
        rootPath = rootPath.replace("\\", "\\\\");
        BufferedWriter writer = null;
        try {
            String filePath = rootPath + File.separator + File.separator + "src"
                    + File.separator + File.separator + "log4j.properties";
            if (contextIsExists(filePath)) {
                // 如果配置文件中已经包含了输出文件路径,则直接返回。
                return;
            }
            writer = new BufferedWriter(new FileWriter(filePath, true));
            writer.newLine();
            writer.write("log4j.appender.E.File=" + outPath + File.separator + File.separator + "logs.log");
            writer.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

我的log4j的appender是使用apache的FileAppender

我想使用一个方法来对配置文件中日志文件的输出路径进行设置

我遇到的问题是:在第一次的单元测试中,总是先出现以下错误提示

log4j:WARN File option not set for appender [E].
log4j:WARN Are you using FileAppender instead of ConsoleAppender?
log4j:ERROR Either File or DatePattern options are not set for appender [E].
log4j:ERROR No output stream or file set for the appender named [E].

然后对配置文件的写操作才完成

总的来说就是对配置文件的写操作是最后完成的,导致获取loger时读取配置文件时写操作还没完成,导致出现错误

 

我以为是指令重排序造成的,但我使用了synchronized的关键字也没有解决问题(我我我的想法是利用set方法动态的对配置文件中的日志输出路径进行设置)

请问以下各位大佬我这是哪里出现了问题?

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 邀请回答

3条回答 默认 最新

  • thomas.he 2021-04-08 11:42
    最佳回答

    用线程来做,使用join()或者用CountDownLatch类来做

    评论
    解决 1 无用
    打赏 举报
查看更多回答(2条)

相关推荐 更多相似问题