2011-11-21 9 views
33

El siguiente método solo escribe el último elemento que he agregado, no se agrega a las entradas anteriores. ¿Qué estoy haciendo mal?PrintWriter método agregar no se agrega

public void addNew() { 
    try { 
     PrintWriter pw = new PrintWriter(new File("persons.txt")); 
     int id = Integer.parseInt(jTextField.getText()); 
     String name = jTextField1.getText(); 
     String surname = jTextField2.getText(); 
     Person p = new Person(id,name,surname); 
     pw.append(p.toString()); 
     pw.append("sdf"); 
     pw.close(); 
    } catch (FileNotFoundException e) {...} 
} 

Respuesta

64

El hecho de que el método PrintWriter 's se llama append() no significa que el modo del archivo que se abrió cambia.

Es necesario abrir los archivos en la modalidad de apertura, así:

PrintWriter pw = new PrintWriter(new FileOutputStream(
    new File("persons.txt"), 
    true /* append = true */)); 

También tenga en cuenta que el archivo se escribirá en la codificación por defecto del sistema. No siempre es deseable y puede causar problemas de interoperabilidad, es posible que desee especificar la codificación de archivos explícitamente.

+0

Esto es como despertar el hilo de dormir, así que lo siento por eso. Pero tengo una duda. ¿Cómo podría anexar la operación en el archivo si solo tengo un objeto File y no puedo usar las clases Stream (por ejemplo, FileOutputStream, etc.)? Lo que me permite es: Printwriter pw = new PrintWriter (archivo); : Intenté agregar(), escribir(), imprimir(). ¿Hay algún método listo para agregar en este escenario? –

+0

Como aclaración, el método 'append()' de PrintWriter se refiere al hecho de que se agrega al escritor, es decir, a sí mismo.e es propio outputtream, y no al archivo. –

+0

Y con referencia a la pregunta de @ user1707035, no, parece que no se puede usar un PrintWriter para anexar sin construirlo con un objeto OutputStream. Esto se debe a que PrintWriter abre la secuencia en el momento de su creación de instancias y los únicos constructores que admiten File o filename como argumento abren el archivo al construir internamente un objeto OutputStream sin el parámetro 'append'. Referencia (documentos): https://docs.oracle.com/javase/7/docs/api/java/io/PrintWriter.html#PrintWriter(java.io.File) –

15
PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"),true)); 

La true es la bandera de agregar. Ver documentation.

9

Abrir el archivo en modalidad de apertura, al igual que con el siguiente código:

PrintWriter pw = new PrintWriter(new FileOutputStream(new File("persons.txt"), true)); 
4

mi humilde opinión la respuesta aceptada no tiene en cuenta el hecho de que la intención es escribir caracteres. (Sé que el tema es antiguo, pero desde que busqué el mismo tema me tropecé con esta publicación antes de encontrar la solución recomendada, publico aquí.)

Del FileOutputStream docs, usa FileOutputStream cuando desea imprimir bytes .

FileOutputStream está diseñado para escribir flujos de bytes sin procesar, como datos de imagen. Para escribir secuencias de caracteres, considere usar FileWriter.

Además, desde el BufferedWriter docs:

A menos que se requiere la salida del sistema, es recomendable envolver un BufferedWriter alrededor de cualquier escritor cuya escritura() las operaciones pueden ser costosos, tales como FileWriters y OutputStreamWriters .

Por último, la respuesta sería la siguiente (como se mencionó in this other StackOverFlow post):

PrintWriter out = null; 
try { 
    out = new PrintWriter(new BufferedWriter(new FileWriter("writePath", true))); 
    out.println("the text"); 
}catch (IOException e) { 
    System.err.println(e); 
}finally{ 
    if(out != null){ 
     out.close(); 
    } 
} 

Además, a partir de Java 7, se puede utilizar una instrucción try-con-recursos. No se requiere bloque finally para cerrar el recurso (s) declarada debido se maneja de forma automática, y también es menos detallado:

try(PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("writePath", true)))) { 
    out.println("the text"); 
}catch (IOException e) { 
    System.err.println(e); 
} 
Cuestiones relacionadas