我编写了一个JavaFx应用程序来查看日志文件。这些文件在新选项卡中打开,我会浏览文本并将其添加到列表视图中。我创建了一个cellfactory来突出显示列表文件中的某些文本,这一切都正常。
问题是日志文件介于800-1300Mb之间。一次打开3-4,JVM达到内存限制。
还有另一种方法可以将目前正在列表视图中显示的文本显示在内存中并且当我将更多内容加载到内存中时?
我需要能够使用滚动条滚动。我搜索了谷歌,我发现了很多相同的问题。人们想在几年前用Java(In Swing)显示一个大文本的1-10Gb文件并且没有答案:
我看了一下分页,但我需要能够使用滚动条,我需要它似乎。用户不应该知道某些部分不在内存中。它们滚动并显示下一行。
有没有人在Java(Swing或JavaFX)中找到解决方案?
答案 0 :(得分:2)
关键是忘记行号。除非每一行的字节数完全相同,否则行号是一种抽象,要求您读取整个文件以查找下一行的位置。
请考虑字节位置,因为您可以通过使用RandomAccessFile或SeekableByteChannel来查找字节位置而无需读取字节之间的字节。当然,那么您必须将字节位置返回到客户端应用程序,以便在获取下一页时可以将其返回到服务器。
使用滚动条进行分页是一种简洁直观的技巧。困难的部分是重新编写滚动条以显示整个文件,而不是仅显示内存中的文件。
注意:刚刚注意到了这个问题的年龄...但是希望我的评论对下一个搜索者有用。
答案 1 :(得分:1)
有两种可能的方法可以防止查看大型日志文件时出现内存问题:
使用Pagination控件并一次加载日志文件的部分或
子类ObservableList并按照Guava Iterable之类的方式支持按需加载数据。
这两种方法只将当前视图所需的日志文件数据加载到内存中,而不是将整个日志文件加载到内存中。