2011-01-06 39 views
68

Vorrei aggiungere una nuova riga a un file esistente senza cancellare le informazioni correnti di quel file. In breve, qui è la metodologia che sto usando il tempo corrente:Come aggiungere una nuova riga di testo a un file esistente in Java?

import java.io.BufferedWriter; 
import java.io.FileWriter; 
import java.io.Writer; 

Writer output; 
output = new BufferedWriter(new FileWriter(my_file_name)); //clears file every time 
output.append("New Line!"); 
output.close(); 

Il problema con le linee di cui sopra è semplicemente stanno cancellando tutti il ​​contenuto del mio file esistente quindi aggiungendo il nuovo testo riga.

Desidero aggiungere del testo alla fine del contenuto di un file senza cancellare o sostituire nulla.

+0

@ ripper234 davvero! Deve essere contrassegnato come duplicato. – rahulserver

risposta

104

è necessario aprire il file in modalità di aggiunta, che può essere ottenuto utilizzando il costruttore FileWriter(String fileName, boolean append).

output = new BufferedWriter(new FileWriter(my_file_name, true)); 

dovrebbe fare il trucco

+2

Grazie mille! Per favore c'è un modo per aggiungere ("\ n") alla fine dopo ogni uscita? Come sapete, si aggiunge tutto in una riga ignorando le mie fughe "\ n"! – CompilingCyborg

+8

'BufferedWriter' ha un metodo' newLine() '. Puoi usarlo, o usare invece un 'PrintWriter', che fornisce un metodo' println() ' –

+2

Grazie! ma per qualche strana ragione quando sto cercando di usare: output.newLine() | non esiste nella lista dei metodi. Sto usando NetBeans 6.9. Tutti gli altri metodi esistono lì. Sai quale potrebbe essere la causa di ciò? – CompilingCyborg

1

on line 2 cambiamento new FileWriter(my_file_name)-new FileWriter(my_file_name, true) così si sta aggiungendo al file piuttosto che sovrascrivere.

2

È possibile utilizzare il costruttore FileWriter(String fileName, boolean append) se si desidera aggiungere dati al file.

modificare il codice a questo:

output = new BufferedWriter(new FileWriter(my_file_name, true)); 

Da FileWriter javadoc:

costruisce un oggetto FileWriter dato un nome file. Se il secondo argomento è true, i byte verranno scritti in alla fine del file anziché all'inizio di .

20

La soluzione con FileWriter sta lavorando, ma non avete la possibilità di specificare la codifica in uscita poi, nel qual caso verrà utilizzata la codifica predefinita per la macchina, e questo è di solito non UTF-8!

così al meglio usare FileOutputStream:

Writer writer = new BufferedWriter(new OutputStreamWriter(
     new FileOutputStream(file, true), "UTF-8")); 
+1

Non dimenticare di chiudere 'FileOutputStream' – yegor256

+0

Questa soluzione risolve il problema per l'aggiunta del file utf-8. – glider

+0

Dovrebbe essere contrassegnato come la risposta migliore :-) –

7

Prova: "\ r \ n"

Java 7 esempio:

// append = true 
try(PrintWriter output = new PrintWriter(new FileWriter("log.txt",true))) 
{ 
    output.printf("%s\r\n", "NEWLINE"); 
} 
catch (Exception e) {} 
+4

\ r \ n è per Windows. È meglio usare la proprietà "line.separator" – rpax

3

Nel caso in cui siete alla ricerca di un metodo di copia e incolla che crea e scrive in un file, ecco quello che ho scritto che prende solo una stringa ingresso. Rimuovere 'true' da PrintWriter se si desidera sovrascrivere il file ogni volta.

private static final String newLine = System.getProperty("line.separator"); 

private synchronized void writeToFile(String msg) { 
    String fileName = "c:\\TEMP\\runOutput.txt"; 
    PrintWriter printWriter = null; 
    File file = new File(fileName); 
    try { 
     if (!file.exists()) file.createNewFile(); 
     printWriter = new PrintWriter(new FileOutputStream(fileName, true)); 
     printWriter.write(newLine + msg); 
    } catch (IOException ioex) { 
     ioex.printStackTrace(); 
    } finally { 
     if (printWriter != null) { 
      printWriter.flush(); 
      printWriter.close(); 
     } 
    } 
} 
8

A partire da Java 7:

definire un percorso e la stringa che contiene il separatore di linea all'inizio:

Path p = Paths.get("C:\\Users\\first.last\\test.txt"); 
String s = System.lineSeparator() + "New Line!"; 

e quindi è possibile utilizzare uno dei seguenti approcci:

  1. Utilizzo Files.write (piccoli file):

    try { 
        Files.write(p, s.getBytes(), StandardOpenOption.APPEND); 
    } catch (IOException e) { 
        System.err.println(e); 
    } 
    
  2. Uso Files.newBufferedWriter (file di testo):

    try (BufferedWriter writer = Files.newBufferedWriter(p, StandardOpenOption.APPEND)) { 
        writer.write(s); 
    } catch (IOException ioe) { 
        System.err.format("IOException: %s%n", ioe); 
    } 
    
  3. Uso Files.newOutputStream (interoperabile con java.io API):

    try (OutputStream out = new BufferedOutputStream(Files.newOutputStream(p, StandardOpenOption.APPEND))) { 
        out.write(s.getBytes()); 
    } catch (IOException e) { 
        System.err.println(e); 
    } 
    
  4. Uso Files.newByteChannel (casuali file di accesso):

    try (SeekableByteChannel sbc = Files.newByteChannel(p, StandardOpenOption.APPEND)) { 
        sbc.write(ByteBuffer.wrap(s.getBytes())); 
    } catch (IOException e) { 
        System.err.println(e); 
    } 
    
  5. Uso (file ad accesso casuale) FileChannel.open:

    try (FileChannel sbc = FileChannel.open(p, StandardOpenOption.APPEND)) { 
        sbc.write(ByteBuffer.wrap(s.getBytes())); 
    } catch (IOException e) { 
        System.err.println(e); 
    } 
    

dettagli su questi metodi possono essere trovati nella Oracle's tutorial.

Problemi correlati