2009-01-05 59 views
9

我們需要使用擺幅加載和顯示大文件(富文本),大約50mb。問題是渲染文件的性能非常差。我們嘗試了JTextPane和JEditorPane都沒有運氣。Swing Large Files性能

有人有這方面的經驗,可以給我一些建議嗎?

感謝,

回答

6

我沒有在這方面的經驗,但如果你真的需要加載大文件,我建議你做一些延遲加載具有的JTextPane/JEditorPane中的。

定義JTextPane/JEditorPane可以很好地處理的限制(如500KB或1MB)。您只需要將該文件的大塊加載到具有此大小的控件中。

首先加載文件的第一個分區。

然後,您需要與滾動容器進行交互,並查看它是否已到達文件當前塊的結尾/開始。如果是這樣,請顯示一個不錯的等待光標,並將前一個/下一個塊加載到內存中並加載到文本控件中。

加載塊根據文件(偏移量)中當前的光標位置計算。

裝載塊=偏移 - 極限/ 2以抵消+限制/ 2

裝載塊或其他用戶感覺就像是在該文件的另一位置上時所述的JTextPane/JEditorPane中的文本必須不會改變。

這不是一個簡單的解決方案,但如果你沒有找到任何其他第三方控件來做到這一點,我會這樣。

+0

我們有同樣的問題。爲此找到了一個好的解決方案?對於看起來很瑣碎的事情,我會討厭這樣做。 – Andez 2012-02-24 14:28:15

0

編寫一個能處理大文檔的高效WYSIWYG文本編輯器是一個相當困難的問題 - 即使Word進入大型書籍時也會出現問題。

擺動是通用目的,但你必須建立一個圍繞它的工具集,包括單獨管理文檔和分頁。

您可以看看Open Office,您可以將OO文檔編輯器屏幕嵌入到您的應用程序中。我相信它被稱爲OOBean ...

2

您可以使用內存映射文件I/O在文件中創建一個「窗口」並讓操作系統處理文件的讀取。

0

即使1mb的文本(特別是長行的文本),JTextPane/JEditorPane也不能很好地處理。

你可以試試JEdit(StandaloneTextArea) - 它比Swing文本組件更快,但我懷疑它會處理這麼多的文本。我嘗試了45米的文件,當它加載(〜25秒),並且我可以向下滾動時,我開始在1700米堆中「超出內存」。

爲了打造一個真正的可擴展解決方案有兩個明顯的選擇真的:

  1. 使用分頁。通過在頁面中顯示文本,您可以使用標準Swing做得很好。

  2. 構建自定義文本渲染器。它可以像可滾動窗格一樣簡單,其中只有可見部分使用BufferedReader來繪製,以跳到文件中的所需行並讀取有限數量的行以顯示。我之前做過,這是一個可行的解決方案。如果您需要具備「文本選擇」功能,那麼這當然是更多的工作。

對於真正的大文件,你可以建立一個包含字符每一行的偏移索引文件,因此得到了「補償」是通過行號快速「RandomAccess」查找和閱讀文本是「 skip「與此偏移量。用這種技術可以查看非常大的文件。

+0

在上面提到的第2點中,假設TextArea最多可以顯示n條記錄。每當用戶向上或向下滾動時,我們都需要從文件中讀取更多行。您將如何確定要讀取的下一行(或前一行)行數? – user3004790 2017-03-11 12:25:29