2009-06-19 17 views
36

Desidero riscrivere il contenuto di un file.È questo il modo migliore per riscrivere il contenuto di un file in Java?

Quello che ho pensato fino ad ora è questo:

  1. Salvare il nome del file
  2. eliminare il file esistente
  3. Creare un nuovo file vuoto con lo stesso nome
  4. Scrivere il contenuto desiderato al file vuoto

È questo il modo migliore? O c'è un modo più diretto, cioè non dover cancellare e creare file, ma semplicemente cambiare il contenuto?

risposta

70

Per sovrascrivere file di foo.log con FileOutputStream:

File myFoo = new File("foo.log"); 
FileOutputStream fooStream = new FileOutputStream(myFoo, false); // true to append 
                   // false to overwrite. 
byte[] myBytes = "New Contents\n".getBytes(); 
fooStream.write(myBytes); 
fooStream.close(); 

o con FileWriter:

File myFoo = new File("foo.log"); 
FileWriter fooWriter = new FileWriter(myFoo, false); // true to append 
                // false to overwrite. 
fooWriter.write("New Contents\n"); 
fooWriter.close(); 
+0

@Ankur: sì. Dipende dal fatto che si stiano scrivendo stringhe o elementi binari in byte per decidere se utilizzare l'approccio OutputStream o Writer. – Stobor

+0

Esiste un metodo per la scrittura di file PDF senza modificarne il nome? – BobDroid

+0

@BabuThangavel Non sono sicuro di cosa stai chiedendo, ma non sembra che sia relativo a questa domanda ... Forse vuoi fare una nuova domanda? – Stobor

2

A meno che non sei solo aggiungere contenuti alla fine, è ragionevole farlo in quel modo. Se si sta aggiungendo, provare FileWriter con il costruttore append.

Un po 'meglio ordine sarebbe:

  1. Creare nuovo nome di file (ad esempio foo.txt.new)
  2. scrivere contenuti aggiornati al nuovo file.
  3. rinomina atomica da foo.txt.new a foo.txt

Purtroppo, renameTo è not guaranteed fare rinominare atomica.

4

See: java.io.RandomAccessFile

Ti consigliamo di aprire una lettura-scrittura del file, in modo da:

RandomAccessFile raf = new RandomAccessFile("filename.txt", "rw"); 
String tmp; 
while (tmp = raf.readLine() != null) { 
    // Store String data 
} 
// do some string conversion 
raf.seek(0); 
raf.writeChars("newString"); 
+0

Ho erroneamente letto la domanda come la necessità di riscrivere un file, ad es. modificare i contenuti, non sostituirli interamente con nuovi contenuti. – drfloob

+0

O risolverà il problema :) – Ankur

+0

In ogni caso, stavo cercando di sovrascrivere una parte specifica del file e questa era la risposta! – fyts

1

Nell'esempio riportato di seguito, il "falso" fa sì che il file da sovrascrivere, vero sarebbe causa il contrario.

File file=new File("C:\Path\to\file.txt"); 
DataOutputStream outstream= new DataOutputStream(new FileOutputStream(file,false)); 
String body = "new content"; 
outstream.write(body.getBytes()); 
outstream.close(); 
+1

Curioso! qual è il vantaggio dell'introduzione di DataOutputSteam? –

+0

I metodi size() e writeUTF() mi sono stati utili fino ad ora, quindi ho scelto di usarlo. Non è inoltre possibile convertire in byte prima di scrivere la stringa utilizzando DataOutputStream. – Sev

+0

DataInputStream e DataOutputStream sono classi specializzate per lavorare con un determinato tipo di file binario; non dovrebbero essere usati su file di testo. Il modo corretto di leggere e scrivere file di testo è con Readers and Writers: FileReader e FileWriter utilizzano la codifica predefinita della piattaforma, mentre InputStreamReader e OutputStreamWriter consentono di specificare la codifica (come UTF-8). –

10

Consiglio vivamente di utilizzare FileUtil di Apache Common per questo. Ho trovato questo pacchetto inestimabile. È facile da usare e altrettanto importante è facile da leggere/capire quando torni un po 'più tardi.

//Create some files here 
File sourceFile = new File("pathToYourFile"); 
File fileToCopy = new File("copyPath"); 

//Sample content 
org.apache.commons.io.FileUtils.writeStringToFile(sourceFile, "Sample content"); 

//Now copy from source to copy, the delete source. 
org.apache.commons.io.FileUtils.copyFile(sourceFile, fileToCopy); 
org.apache.commons.io.FileUtils.deleteQuietly(sourceFile); 

Maggiori informazioni sono disponibili all'indirizzo: http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html

1

Ci sono momenti in cui si consiglia di tenere un file vuoto enorme in modo da evitare un costo aggiuntivo del sistema operativo allocare spazio su base bisogno. Questo viene generalmente eseguito da database, macchine virtuali e anche in programmi batch che elaborano e scrivono dati di massa. Ciò migliorerebbe significativamente le prestazioni dell'applicazione. In questi casi, scrivere un nuovo file e rinominarlo non sarebbe di grande aiuto. Invece, il file vuoto dovrà essere riempito. Questo è quando si deve andare per la modalità di override.

1

GuavaFile.write "sovrascrive un file con il contenuto di un array di byte":

Files.write(bytes, new File(path)); 
Problemi correlati