我們需要使用擺幅加載和顯示大文件(富文本),大約50mb。問題是渲染文件的性能非常差。我們嘗試了JTextPane和JEditorPane都沒有運氣。Swing Large Files性能
有人有這方面的經驗,可以給我一些建議嗎?
感謝,
我們需要使用擺幅加載和顯示大文件(富文本),大約50mb。問題是渲染文件的性能非常差。我們嘗試了JTextPane和JEditorPane都沒有運氣。Swing Large Files性能
有人有這方面的經驗,可以給我一些建議嗎?
感謝,
我沒有在這方面的經驗,但如果你真的需要加載大文件,我建議你做一些延遲加載具有的JTextPane/JEditorPane中的。
定義JTextPane/JEditorPane可以很好地處理的限制(如500KB或1MB)。您只需要將該文件的大塊加載到具有此大小的控件中。
首先加載文件的第一個分區。
然後,您需要與滾動容器進行交互,並查看它是否已到達文件當前塊的結尾/開始。如果是這樣,請顯示一個不錯的等待光標,並將前一個/下一個塊加載到內存中並加載到文本控件中。
加載塊根據文件(偏移量)中當前的光標位置計算。
裝載塊=偏移 - 極限/ 2以抵消+限制/ 2
裝載塊或其他用戶感覺就像是在該文件的另一位置上時所述的JTextPane/JEditorPane中的文本必須不會改變。
這不是一個簡單的解決方案,但如果你沒有找到任何其他第三方控件來做到這一點,我會這樣。
編寫一個能處理大文檔的高效WYSIWYG文本編輯器是一個相當困難的問題 - 即使Word進入大型書籍時也會出現問題。
擺動是通用目的,但你必須建立一個圍繞它的工具集,包括單獨管理文檔和分頁。
您可以看看Open Office,您可以將OO文檔編輯器屏幕嵌入到您的應用程序中。我相信它被稱爲OOBean ...
您可以使用內存映射文件I/O在文件中創建一個「窗口」並讓操作系統處理文件的讀取。
即使1mb的文本(特別是長行的文本),JTextPane/JEditorPane也不能很好地處理。
你可以試試JEdit(StandaloneTextArea) - 它比Swing文本組件更快,但我懷疑它會處理這麼多的文本。我嘗試了45米的文件,當它加載(〜25秒),並且我可以向下滾動時,我開始在1700米堆中「超出內存」。
爲了打造一個真正的可擴展解決方案有兩個明顯的選擇真的:
使用分頁。通過在頁面中顯示文本,您可以使用標準Swing做得很好。
構建自定義文本渲染器。它可以像可滾動窗格一樣簡單,其中只有可見部分使用BufferedReader來繪製,以跳到文件中的所需行並讀取有限數量的行以顯示。我之前做過,這是一個可行的解決方案。如果您需要具備「文本選擇」功能,那麼這當然是更多的工作。
對於真正的大文件,你可以建立一個包含字符每一行的偏移索引文件,因此得到了「補償」是通過行號快速「RandomAccess」查找和閱讀文本是「 skip「與此偏移量。用這種技術可以查看非常大的文件。
在上面提到的第2點中,假設TextArea最多可以顯示n條記錄。每當用戶向上或向下滾動時,我們都需要從文件中讀取更多行。您將如何確定要讀取的下一行(或前一行)行數? – user3004790 2017-03-11 12:25:29
我們有同樣的問題。爲此找到了一個好的解決方案?對於看起來很瑣碎的事情,我會討厭這樣做。 – Andez 2012-02-24 14:28:15