无需创建文件锁即可读取外部日志文件

时间:2012-11-18 22:46:03

标签: java file filelock randomaccessfile

尝试逐行读取日志文件(使用Java)。此日志文件由另一个进程(非Java程序)同时写入。

我有两种方法 -

  1. BufferedReader(BufferedReader br = new BufferedReader(new FileReader(logFile));)
  2. RandomAccessFile(RandomAccessFile accessFile = new RandomAccessFile(logFile.getAbsolutePath(),“r”);)
  3. 这两种方法都会导致文件被锁定,直到我在BufferedReader / RandomAccessFile对象上调用'close'方法?

    是否有其他方法(Java)以这样的方式读取文件:文件没有被其他进程/程序锁定/阻止?

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

2 个答案:

答案 0 :(得分:4)

看看这个:Java: opening and reading from a file without locking it

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

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

答案 1 :(得分:0)

BufferedReader在性能方面优于RandomAccessFile,但它们都不会锁定文件,除非操作系统对你这样做,在这种情况下关闭文件将释放它。

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

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