如何为大日志文件编写Java文本文件查看器

Han*_*ger 11 java design-patterns scalability

我正在开发一个带有集成日志文件查看器的软件产品.问题是,它对于非常大的文件来说是缓慢且不稳定的,因为它在您查看日志文件时将整个文件读入内存.我想写一个新的日志文件查看器来解决这个问题.

为大文本文件编写查看器的最佳做法是什么?像notepad ++和VIM这样的编辑器如何实现这一目标?我正在考虑使用缓冲的双向文本流阅读器和Java的TableModel.我是否按照正确的思路思考,是否有适用于Java的流实现?

编辑:是否值得运行一次文件来索引每行文本开头的位置,以便知道在哪里寻找?我可能需要大量的行,所以可能需要扫描文件至少一次?

Edit2:我已将我的实现添加到下面的答案中.请对其进行评论或编辑,以帮助我/我们达到更好的实践实施或以其他方式提供您自己的实施.

Mar*_*ams 4

我不确定 NotePad++ 实际上实现了随机访问,但我认为这是可行的方法,尤其是使用日志文件查看器时,这意味着它将是只读的。

由于您的日志查看器是只读的,因此您可以使用只读随机存取存储器映射文件“流”。在 Java 中,这是FileChannel

然后根据需要在文件中跳转,并将数据的滚动窗口渲染到屏幕上。

FileChannel 的优点之一是并发线程可以打开文件,并且读取不会影响当前文件指针。因此,如果您在另一个线程中附加到日志文件,它不会受到影响。

另一个优点是您可以随时调用 FileChannel 的 size 方法来获取文件大小。

将内存直接映射到随机访问文件(某些文本编辑器(例如 HxD 和 UltraEdit)允许)的问题是任何更改都会直接影响文件。因此,更改是立即的(写入缓存除外),这是用户通常不希望发生的事情。相反,用户通常不希望进行更改,直到单击“保存”。但是,由于这只是一个查看器,因此您不会有同样的担忧。