读取外部日志文件而不创建文件锁

问题描述 投票:0回答:2

尝试逐行读取日志文件(在 Java 中)。该日志文件正在由另一个进程(非 Java 程序)同时写入。

我有两种方法:

  1. BufferedReader
    • BufferedReader br = new BufferedReader(new FileReader(logFile));
  2. RandomAccessFile
    • RandomAccessFile accessFile = new RandomAccessFile(logFile.getAbsolutePath(), "r");

这两种方法都会导致文件被锁定,直到我在

close
/
BufferedReader
对象上调用
RandomAccessFile
方法吗?

Java 中是否有其他方法可以读取文件,从而使文件不会被其他进程/程序锁定/阻止?

PS:在我所有的搜索中,我遇到了这个问题的多个答案/解决方案(旧的和新的)。我只是想寻求对这个问题的澄清/结束。

java file file-locking randomaccessfile
2个回答
4
投票

看看这个:Java:打开并读取文件而不锁定它

如果非 Java 进程在写入时对该文件具有独占锁,则其他进程可能无法读取该文件。当然,这可能会因操作系统而略有不同。您可能想查看非 Java 进程运行时操作系统对文件锁定的说明。

如果共享锁可用,那么 java.nio 可能允许对锁定行为进行更多控制:http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html


0
投票
从性能角度来看,

BufferedReader
优于
RandomAccessFile
,但它们都不会锁定文件,除非操作系统善意地为您这样做,在这种情况下,关闭文件将释放它。

但是,如果其他人正在写入该文件,操作系统也可能会阻止您读取该文件。

在另一个进程正在写入时读取顺序文件并不是一个好的设计。您根本不应该真正阅读日志文件。日志文件是为人类服务的。您应该使用数据库。

© www.soinside.com 2019 - 2024. All rights reserved.