尝试逐行读取日志文件(在 Java 中)。该日志文件正在由另一个进程(非 Java 程序)同时写入。
我有两种方法:
BufferedReader
BufferedReader br = new BufferedReader(new FileReader(logFile));
)RandomAccessFile
RandomAccessFile accessFile = new RandomAccessFile(logFile.getAbsolutePath(), "r");
这两种方法都会导致文件被锁定,直到我在
close
/BufferedReader
对象上调用 RandomAccessFile
方法吗?
Java 中是否有其他方法可以读取文件,从而使文件不会被其他进程/程序锁定/阻止?
PS:在我所有的搜索中,我遇到了这个问题的多个答案/解决方案(旧的和新的)。我只是想寻求对这个问题的澄清/结束。
看看这个:Java:打开并读取文件而不锁定它
如果非 Java 进程在写入时对该文件具有独占锁,则其他进程可能无法读取该文件。当然,这可能会因操作系统而略有不同。您可能想查看非 Java 进程运行时操作系统对文件锁定的说明。
如果共享锁可用,那么 java.nio 可能允许对锁定行为进行更多控制:http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html
BufferedReader
优于RandomAccessFile
,但它们都不会锁定文件,除非操作系统善意地为您这样做,在这种情况下,关闭文件将释放它。
但是,如果其他人正在写入该文件,操作系统也可能会阻止您读取该文件。
在另一个进程正在写入时读取顺序文件并不是一个好的设计。您根本不应该真正阅读日志文件。日志文件是为人类服务的。您应该使用数据库。