日志文件读取程序问题:读取失败时循环续行及程序冻结解决
解决你的日志文件读取问题
问题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
相关产品推荐
相关产品推荐

