2

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

我有两种方法-

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

这两种方法是否都会导致文件被锁定,直到我在 BufferedReader/RandomAccessFile 对象上调用“关闭”方法?

是否有任何其他方式(Java)以不为其他进程/程序锁定/阻止文件的方式读取文件?

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

4

2 回答 2

4

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

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

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

于 2012-11-18T23:12:09.297 回答
0

BufferedReader 在性能方面比 RandomAccessFile 更可取,但它们都不会锁定文件,除非操作系统为您这样做,在这种情况下关闭文件将释放它。

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

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

于 2012-11-18T23:43:16.743 回答