如何在Java中高效地跟踪更改(以及最重要的读取)真正大的文件

如何在Java中高效地跟踪更改(以及最重要的读取)真正大的文件,java,file,file-io,bigdata,Java,File,File Io,Bigdata,我有一个文本形式的大日志文件,由第三方应用程序创建。不幸的是,我的文件是150MB,其他人可能有更大的文件,这取决于他们开始记录的日期。由于该文件是由第三方应用程序创建的,因此我无法以任何方式对其进行真正的修改(例如删除一些最旧的内容) 我想做的是跟踪文件大小,并在添加新行时收到通知(因此文件大小会发生更改),然后读取这一行(这将是最后一行) 我知道,当我想要跟踪更改时,不一定要不断更新,而是当用户在托盘中最小化应用程序时。本质上,我想在用户看不到应用程序状态的变化时通知用户 现在,我使用 Fi

我有一个文本形式的大日志文件,由第三方应用程序创建。不幸的是,我的文件是150MB,其他人可能有更大的文件,这取决于他们开始记录的日期。由于该文件是由第三方应用程序创建的,因此我无法以任何方式对其进行真正的修改(例如删除一些最旧的内容)

我想做的是跟踪文件大小,并在添加新行时收到通知(因此文件大小会发生更改),然后读取这一行(这将是最后一行)

我知道,当我想要跟踪更改时,不一定要不断更新,而是当用户在托盘中最小化应用程序时。本质上,我想在用户看不到应用程序状态的变化时通知用户

现在,我使用

File file = new File("filepath"); 
file.length();
据我所知,这不会将文件加载到内存中,因此不会造成太大的性能下降

如果我是对的,那么读取该文件最后一行的最有效方法是什么


将效率替换为“尽可能低的性能下降”。我不介意将实际事件记录到文件和通知用户之间有2秒或3秒的延迟。

您可以使用DirectoryWatcher来通知目录或文件的更改。您可以使用RandomAccessFile将数据卷绕到任何位置,例如按字节读取到最后一个,然后从该点读取字节。如果您特别关心编码,那么可以使用不推荐使用的readLine()方法

否则,我建议您将整行复制到缓冲区,例如ByteArrayOutputStream,并使用正确的编码对其进行解码

您希望首先复制的原因是,您可能会得到不完整的行,甚至是不完整的多字节字符,而Bufferedreader并不能很好地处理这些字符