2009-06-16 18 views
5

Estoy usando BufferedReader y PrintWriter para recorrer cada línea de un archivo de entrada, realizar un cambio en algunas líneas y generar el resultado. Si una línea no sufre un cambio, solo se imprime como está en el archivo de salida. Sin embargo, por alguna razón, el proceso finaliza prematuramente. El código es como la siguiente:¿Problemas con BufferedReader/PrintWriter?

BufferedReader in = new BufferedReader(new FileReader("in.txt")); 
FileOutputStream out = new FileOutputStream("out.txt"); 
PrintWriter p = new PrintWriter(out); 
String line = in.readLine(); 

while(line!=null) 
{ 
    if(line is special) 
     do edits and p.println(edited_line); 
    else 
     p.println(line); 

    line = in.readLine(); 
} 

Sin embargo, por alguna extraña razón, este proceso termina prematuramente (en realidad imprime una mitad de una línea) hacia el final de mi archivo de entrada. ¿Alguna razón obvia para esto? El ciclo while está siendo claramente terminado por un nulo. Y está hacia el final de mi archivo txt de línea de 250k +. ¡Gracias!

+0

¿Estás absolutamente seguro de que no hay excepciones se están lanzando? ¿Qué harías si se arrojara una excepción *? ¿Sería registrado? –

+0

Jon: no olvide que PrintWriter elimina excepciones: debe usar el método "checkError" para ver si ocurrió alguna. – MetroidFan2002

+0

Sí, pero BufferedReader y FileReader no lo hacen, por lo que la llamada a readLine() podría haberse lanzado. –

Respuesta

7

¿Dónde vacia/cierra su PrintWriter o FileOutputStream? Si el programa se cierra y esto no se hace, no se escribirán todos sus resultados.

Es necesario out.close() (posiblemente un p.flush() así?) Al final de su proceso para cerrar el flujo de salida de archivos

+1

El cierre es mejor que simplemente enjuagar. +1 –

+1

No olvides hacer esto en un bloque finally en caso de que haya una excepción. –

+0

Eso debería ser p.close(). p.flush() * should * no es necesario, pero es bueno saber que PrintWriter no se vacía antes de que cierre la transmisión subyacente. Si esa secuencia tiene un error (-> tampoco se descarga al cerrar), volverás a tener el mismo problema. –

1

Intenta agregar un p.flush() después del ciclo.

1

PrintWriter no tiene activado el autoflushing, por lo que es probable que el último bit del archivo no se descargue antes de que el programa finalice.

Agregando un p.flush() después de su ciclo while debería hacer el truco.