Производительность Swing Large Files - PullRequest
9 голосов
/ 05 января 2009

Нам нужно загружать и отображать большие файлы (форматированный текст), используя качели, около 50 МБ. Проблема в том, что производительность рендеринга файлов невероятно низкая. Мы попробовали и JTextPane, и JEditorPane без удачи.

Есть ли у кого-то опыт с этим и могли бы дать мне какой-нибудь совет?

спасибо,

Ответы [ 4 ]

6 голосов
/ 05 января 2009

У меня нет никакого опыта в этом, но если вам действительно нужно загружать большие файлы, я предлагаю вам выполнить некоторую ленивую загрузку с помощью JTextPane / JEditorPane.

Определите предел, который JTextPane / JEditorPane может хорошо обрабатывать (например, 500 КБ или 1 МБ). Вам нужно только загрузить кусок файла в элемент управления с таким размером.

Начните с загрузки 1-го раздела файла.

Затем вам нужно взаимодействовать с контейнером прокрутки и посмотреть, достиг ли он конца / начала текущего фрагмента файла. Если это так, покажите хороший курсор ожидания и загрузите предыдущий / следующий фрагмент в память и в текстовый элемент управления.

Блок загрузки рассчитывается из вашей текущей позиции курсора в файле (смещение).

загрузка чанка = смещение - предел / 2 к смещению + предел / 2

Текст в JTextPane / JEditorPane не должен изменяться при загрузке фрагментов, иначе пользователь считает, что он находится в другой позиции файла.

Это не тривиальное решение, но если вы не найдете какой-либо другой сторонний контроль для этого, я бы пошел по этому пути.

2 голосов
/ 06 января 2009

Вы можете использовать ввод-вывод файла с отображением в памяти, чтобы создать «окно» в файле и позволить операционной системе обрабатывать чтение файла.

0 голосов
/ 12 сентября 2013

JTextPane / JEditorPane плохо обрабатывают даже 1 Мб текста (особенно текст с длинными строками).

Вы можете попробовать JEdit ( StandaloneTextArea ) - это намного быстрее, чем текстовые компоненты Swing, но я сомневаюсь, что он справится с таким большим количеством текста. Я попытался с 45-метровым файлом, и, хотя он был загружен (~ 25 секунд), и я мог прокрутить вниз, я начал получать «outofmemory» с кучей 1700 м.

Чтобы создать действительно масштабируемое решение, есть два очевидных варианта:

  1. Используйте нумерацию страниц. Вы можете сделать это нормально со стандартным Swing, отображая текст на страницах.

  2. Создание пользовательского средства визуализации текста. Это может быть так же просто, как прокручиваемая панель, где рисуется только видимая часть, используя BufferedReader , чтобы перейти к нужной строке в файле и прочитать ограниченное количество строк для отображения. Я делал это раньше, и это работоспособное решение. Если вам нужны возможности «выделения текста», это, конечно, немного больше работы.

Для действительно больших файлов вы можете создать индексный файл, который содержит смещения каждой строки в символах, поэтому получение «смещения» - это быстрый « RandomAccess » поиск по номеру строки и чтение текста: " skip " с этим смещением. С помощью этой техники можно просматривать очень большие файлы.

0 голосов
/ 05 января 2009

Создание эффективного текстового редактора WYSIWYG, который может обрабатывать большие документы, является довольно сложной проблемой - даже у Word возникают проблемы, когда вы попадаете в большие книги.

Swing общего назначения, но вы должны создать вокруг него набор инструментов, включающий отдельное управление документами и их разбиение на страницы.

Вы можете посмотреть на Open Office, вы можете встроить экран редактора документов OO прямо в ваше приложение. Я считаю, что это называется OOBean ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...