Java - Leer y trabajar con un archivo .txt grande

   
Vista:

Leer y trabajar con un archivo .txt grande

Publicado por lekio (3 intervenciones) el 20/01/2012 17:49:18
Antes que nada saludar a todos los integrantes de este foro. Estoy realizando una aplicacion swing, donde necesito que al pulsar un boton, lea un archivo .txt de gran tamaño, donde las lineas tienen unos datos separados por tabulacion ( cada linea puede tener unos 120 caracteres y algunas tienen 3 campos y otras 4) y los muestre en jtextarea. Pues bien, consigo leer el archivo, trabajar con los datos ( solamente necesito meter una tabulacion mas entre los ultimos datos ) y que se muestren en el jtextarea, pero llega un momento donde la aplicacion se queda congelada, el jprogressbar no sigue funcioanndo y aveces se pone la pantalla en negra. He probado en modo de depuracion, pero en netbean no me da ningun error. Sin embargo si leo un archivo .txt de menor tamaño ( unos poco megas ) si lo hace correctamente.

P.d. El txt de gran tamaño puede tener unas 500.000 lineas, pongo aqui la clase que lee los datos, trabaja con ellos y muestra por ventana, como vereis es un hilo para no interferir con el hilo del swing.

Agradezco mucho toda la ayuda que me podais prestar.



class cPro extends Thread{



String lineapro;


public cPro(){

}


public void run(){
jBar3.setIndeterminate(true);
try {
while((lineapro=vproo.readLine())!=null){ //vproo lo defino dentro del boton del swing

Matcher m1 = p1.matcher(lineapro); // Matcher es una variable global
if(m1.find()){
if(lineapro.split("\t").length==3) {
if(lineapro.split("\t")[2].length()==3 || lineapro.split("\t")[2].length()==30){
synchronized (jTextArea6){

jTextArea6.append(lineapro+"\t\n");
contproo++;
jLabel15.setText("Contador: "+contproo);
}

}
else
{
synchronized (jTextArea7){
jTextArea7.append(lineapro+"\n");
contproomal++;
jLabel17.setText("Contador: "+contproomal);

}}
}
if(lineapro.split("\t").length==4) {
if(lineapro.split("\t")[2].length()==3 || lineapro.split("\t")[2].length()==30){
synchronized (jTextArea6){

jTextArea6.append(lineapro.replace(lineapro.split("\t")[3], "\t"+lineapro.split("\t")[3])+"\n");
contproo++;
jLabel15.setText("Contador: "+contproo);

}
}
else
{
synchronized (jTextArea7){
jTextArea7.append(lineapro+"\n");
contproomal++;
jLabel17.setText("Contador: "+contproomal);

}
}
}
if(lineapro.split("\t").length!=3 && lineapro.split("\t").length!=4){
synchronized (jTextArea7){
jTextArea7.append(lineapro+"\n");
contproomal++;
jLabel17.setText("Contador: "+contproomal);


}
}
}
else{
synchronized (jTextArea7){
jTextArea7.append(lineapro+"\n");
contproomal++;
jLabel17.setText("Contador: "+contproomal);

}
}
}
}
catch (IOException ex) {
Logger.getLogger(cVbulletin.class.getName()).log(Level.SEVERE, null, ex);
}
finally {
jBar3.setIndeterminate(false);
Thread.currentThread().stop();
}

}
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Leer y trabajar con un archivo .txt grande

Publicado por Tom (915 intervenciones) el 23/01/2012 09:46:12
Ahorrarás bastante memoria usando mapped buffers:

http://www.javamex.com/tutorials/io/nio_mapped_buffer.shtml
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar