2009-01-05 31 views
9

Chúng tôi cần tải và hiển thị các tệp lớn (văn bản đa dạng thức) bằng cách sử dụng xoay, khoảng 50mb. Vấn đề là hiệu suất để hiển thị các tệp là cực kỳ kém. Chúng tôi đã thử cả JTextPane và JEditorPane mà không có may mắn.Hiệu suất tệp Swing lớn

Có ai có kinh nghiệm với điều này và có thể cho tôi một số lời khuyên không?

cảm ơn,

Trả lời

6

tôi không có bất kỳ kinh nghiệm trong việc này nhưng nếu bạn thực sự cần phải tải các tập tin lớn, tôi đề nghị bạn làm một số loại tải lười biếng với JTextPane/JEditorPane.

Xác định giới hạn mà JTextPane/JEditorPane có thể xử lý tốt (như 500KB hoặc 1MB). Bạn sẽ chỉ cần tải một đoạn tệp vào bộ điều khiển có kích thước này.

Bắt đầu bằng cách tải phân vùng thứ nhất của tệp.

Sau đó, bạn cần phải tương tác với vùng chứa cuộn và xem nó đã đến cuối/đầu của đoạn hiện tại của tệp. Nếu vậy, hiển thị một con trỏ chờ đợi tốt đẹp và tải đoạn trước đó/tiếp theo vào bộ nhớ và vào điều khiển văn bản.

Đoạn tải được tính từ vị trí con trỏ hiện tại của bạn trong tệp (offset).

tải đoạn = bù đắp - giới hạn/2 để bù đắp + giới hạn/2

Các văn bản trên JTextPane/JEditorPane không được thay đổi khi tải khối hay khác cho người dùng cảm giác như đang ở trong một vị trí của tập tin.

Đây không phải là một giải pháp tầm thường nhưng nếu bạn không tìm thấy bất kỳ kiểm soát của bên thứ ba nào khác để thực hiện việc này, tôi sẽ đi theo cách này.

+0

Chúng tôi có cùng một vấn đề. Là một giải pháp tốt được tìm thấy cho điều này? Đối với một cái gì đó có vẻ tầm thường, tôi ghét phải làm điều này. – Andez

0

Viết một trình soạn thảo văn bản WYSIWYG hiệu quả có thể xử lý các tài liệu lớn là một vấn đề khá khó khăn - Ngay cả Word cũng có vấn đề khi bạn nhận được những cuốn sách lớn.

Swing là mục đích chung, nhưng bạn phải xây dựng một bộ công cụ xung quanh nó liên quan đến việc quản lý tài liệu một cách riêng biệt và phân trang chúng.

Bạn có thể xem Open Office, bạn có thể nhúng màn hình trình chỉnh sửa tài liệu OO ngay vào ứng dụng của mình. Tôi tin rằng nó được gọi là OOBean ...

2

Bạn có thể sử dụng Bộ nhớ ánh xạ tệp I/O để tạo 'cửa sổ' vào tệp và cho phép hệ điều hành xử lý việc đọc tệp.

0

JTextPane/JEditorPane không xử lý tốt ngay cả 1mb văn bản (đặc biệt là văn bản có dòng dài).

Bạn có thể thử JEdit (StandaloneTextArea) - nó nhanh hơn nhiều so với các thành phần văn bản Swing, nhưng tôi nghi ngờ nó sẽ xử lý nhiều văn bản này. Tôi đã thử với tập tin 45m, và trong khi nó đã được tải (~ 25 giây) và tôi có thể di chuyển xuống, tôi bắt đầu nhận được "outofmemory" với đống 1700m.

Để xây dựng một giải pháp thực sự khả năng mở rộng có hai tùy chọn hiển nhiên thực sự:

  1. Sử dụng pagination. Bạn có thể làm tốt với Swing tiêu chuẩn bằng cách hiển thị văn bản trong các trang.

  2. Tạo trình kết xuất văn bản tùy chỉnh.Nó có thể đơn giản như một ngăn có thể cuộn mà chỉ phần hiển thị được vẽ bằng cách sử dụng BufferedReader để chuyển đến dòng mong muốn trong tệp và đọc một số dòng giới hạn để hiển thị. Tôi đã làm nó trước và nó là một giải pháp khả thi. Nếu bạn cần phải có khả năng 'lựa chọn văn bản', điều này là một ít công việc hơn, tất nhiên.

Đối với tập tin thực sự lớn, bạn có thể xây dựng một tập tin chỉ mục có chứa offsets của mỗi dòng trong nhân vật, vì vậy nhận được "bù đắp" là một cách nhanh chóng "RandomAccess" tra cứu bằng số dòng, và đọc văn bản là một " skip "với bù đắp này. Có thể xem các tệp rất lớn bằng kỹ thuật này.

+0

Trong điểm 2 được đề cập ở trên, hãy cho phép TextArea có thể hiển thị tối đa n bản ghi. Bất cứ khi nào người dùng cuộn lên hoặc xuống, chúng tôi sẽ cần đọc thêm một số dòng từ tệp. Làm thế nào bạn sẽ xác định những gì tiếp theo (hoặc trước đó) số dòng để đọc? – user3004790

Các vấn đề liên quan