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

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类来做

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来