0

我编写了一个 JavaFx 应用程序来查看日志文件。每个文件都在一个新选项卡中打开,我浏览了文本并将其添加到列表视图中。我创建了一个 cellfactory 来突出显示列表文件中的某些文本,这一切正常。

问题是日志文件在 800-1300Mb 之间。一次打开 3-4 并且 JVM 达到了它的内存限制。

是否有另一种方法可以使当前仅显示在内存列表视图中的文本,并且当我滚动时将更多内容加载到内存中?


我需要能够使用滚动条滚动。我搜索了谷歌,我发现了很多相同的问题。人们想在几年前用 Java(In Swing)显示大型文本 1-10Gb 文件,但没有答案:

我看了一下分页,但我需要能够使用滚动条,而且我需要它。用户不应该知道某些部分不在内存中。他们滚动并显示下一行。

有没有人在 Java(Swing 或 JavaFX)中找到解决方案?

4

2 回答 2

2

关键是忘记行号。除非每一行的字节数完全相同,否则行号是一种抽象,需要您读取整个文件才能找到下一行的位置。

而是考虑字节位置,因为您可以通过使用RandomAccessFileSeekableByteChannel来查找该位置而无需读取其间的字节。当然,您必须将字节位置返回给客户端应用程序,以便在获取下一页时将其返回给服务器。

使用滚动条进行分页是一种简洁直观的技巧。困难的部分是重写滚动条以显示整个文件,而不仅仅是内存中的内容。

注意:刚刚注意到这个问题有多老了......但希望我的评论对下一个搜索者有用。

于 2019-01-30T22:14:02.320 回答
1

防止查看大型日志文件时出现内存问题的几种可能方法:

  1. 使用分页控件并一次加载部分日志文件或

  2. 子类ObservableList并通过像Guava Iterable这样按需加载数据的东西来支持它。

这两种方法都只将当前视图所需的日志文件数据加载到内存中,而不是将整个日志文件加载到内存中。

于 2013-08-14T18:52:47.743 回答