2009-01-05 13 views
9

Tenemos que cargar y mostrar archivos de gran tamaño (texto enriquecido) con swing, sobre 50mb. El problema es que el rendimiento para procesar los archivos es increíblemente pobre. Probamos ambos JTextPane y JEditorPane sin suerte.Oscilación Archivos grandes Rendimiento

¿Alguien tiene experiencia con esto y podría darme algún consejo?

gracias,

Respuesta

6

que no tienen ninguna experiencia en esto, pero si usted realmente necesita para cargar archivos de gran tamaño que sugieren que hace algún tipo de carga diferida con JTextPane/JEditorPane.

Define un límite que JTextPane/JEditorPane puede manejar bien (como 500 KB o 1 MB). Solo necesitará cargar una porción del archivo en el control con este tamaño.

Comience cargando la primera partición del archivo.

Luego necesita interactuar con el contenedor de desplazamiento y ver si ha llegado al final/comienzo del fragmento actual del archivo. Si es así, muestre un buen cursor de espera y cargue el fragmento anterior/siguiente en la memoria y en el control de texto.

El fragmento de carga se calcula desde la posición actual del cursor en el archivo (desplazamiento).

carga trozo = compensado - Limitar/2 + para compensar limitar/2

El texto de la JTextPane/JEditorPane no debe cambiar cuando la carga de trozos o de lo contrario el usuario se siente como está en otra posición del archivo.

Esto no es una solución trivial, pero si no encuentra ningún otro control de terceros para hacer esto, yo iría por este camino.

+0

Tenemos el mismo problema. ¿Se encontró una buena solución para esto? Para algo que parece tan trivial, odiaría hacer esto. – Andez

0

Escribir un editor de texto WYSIWYG eficaz que pueda manejar documentos grandes es un problema bastante difícil: incluso Word tiene problemas cuando entra en libros grandes.

Swing es de propósito general, pero tiene que crear un conjunto de herramientas que implique gestionar documentos por separado y buscarlos.

Puede consultar Open Office, puede insertar una pantalla del editor de documentos OO directamente en su aplicación. Creo que se llama OOBean ...

2

Puede usar la E/S de archivos asignados de memoria para crear una 'ventana' en el archivo y dejar que el sistema operativo maneje la lectura del archivo.

0

JTextPane/JEditorPane no manejan bien incluso 1mb de texto (especialmente texto con líneas largas).

Puede probar JEdit (StandaloneTextArea) - es mucho más rápido que los componentes de texto Swing, pero dudo que maneje este texto. Intenté con el archivo de 45m, y mientras estaba cargado (~ 25 segundos) y pude desplazarme hacia abajo, comencé a obtener "memoria" con un montón de 1700m.

Con el fin de construir una solución muy escalable hay dos opciones obvias: en realidad

  1. Uso de paginación. Puede hacerlo bien con Swing estándar al mostrar texto en páginas.

  2. Cree un procesador de texto personalizado.Puede ser tan simple como un panel desplazable donde solo se dibuja la parte visible usando BufferedReader para saltar a la línea deseada en el archivo y leer un número limitado de líneas para mostrar. Lo hice antes y es una solución viable. Si necesita tener capacidades de "selección de texto", esto es un poco más de trabajo, por supuesto.

Para archivos muy grandes se podría construir un archivo de índice que contiene las compensaciones de cada línea de caracteres, así que conseguir el "desplazamiento" es un "RandomAccess" búsqueda rápida por el número de línea, y la lectura del texto es un " skip "con este desplazamiento. Se pueden ver archivos muy grandes con esta técnica.

+0

En el punto 2 mencionado anteriormente, digamos que TextArea puede mostrar n registros al máximo. Cada vez que un usuario se desplaza hacia arriba o hacia abajo, tendremos que leer algunas líneas más del archivo. ¿Cómo vas a determinar qué número de líneas siguientes (o previas) leer? – user3004790