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