You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

日志文件读取程序问题:读取失败时循环续行及程序冻结解决

解决你的日志文件读取问题

问题1:读取文件时被外部访问导致程序冻结

你碰到的冻结问题,大概率是因为Java默认的FileReader是以独占模式打开文件的——当你手动访问这个文件时,两个进程就会因为锁竞争陷入阻塞。解决核心是让文件以共享读的方式打开,允许其他进程同时读取。

你可以替换掉原来的FileReader初始化逻辑,改用Files.newBufferedReader()并指定共享读选项:

import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.charset.StandardCharsets;
import java.nio.file.StandardOpenOption;
import java.io.BufferedReader;

// 替换原有的流初始化代码
BufferedReader br = Files.newBufferedReader(
    Paths.get(lister.getAbsolutePath()),
    StandardCharsets.UTF_8,
    StandardOpenOption.READ,
    StandardOpenOption.SHARE_READ
);

这样设置后,即使外部程序访问该文件,你的读取进程也不会被卡死了。

问题2:读取失败时让循环进入下一次迭代

要实现“读取失败就跳过当前文件、继续下一个”,你需要把单个文件的读取逻辑放在独立的try-catch块中,而不是把整个循环包裹在try里。这样当某个文件出错时,异常被捕获后执行continue,就能直接进入下一次循环迭代。

调整后的代码示例(顺便用了try-with-resources自动关流,避免资源泄漏):

public static void processLogFiles(File[] files) {
    for (File logFile : files) {
        System.out.println("Processing file: " + logFile);
        // 每个文件单独处理异常
        try (BufferedReader br = Files.newBufferedReader(
                Paths.get(logFile.getAbsolutePath()),
                StandardCharsets.UTF_8,
                StandardOpenOption.READ,
                StandardOpenOption.SHARE_READ)) {
            
            String line;
            while ((line = br.readLine()) != null) {
                // 这里写导入数据库的逻辑
                // ...
            }
        } catch (Exception e) {
            // 打印错误信息方便排查
            System.err.println("Failed to read file: " + logFile.getAbsolutePath());
            e.printStackTrace();
            // 跳过当前文件,进入下一次循环
            continue;
        }
        // 文件读取成功后的后续操作(如果有的话)
    }
}

另外建议把方法名从file改成更有语义的名字(比如processLogFiles),代码可读性会好很多。

内容的提问来源于stack exchange,提问作者Ryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:09:24