方思永江 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条)

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题