Domanda

Voglio riscrivere il contenuto di un file.

Quello che ho pensato finora è questo:

  1. Salva il nome del file
  2. Elimina il file esistente
  3. Crea un nuovo file vuoto con lo stesso nome
  4. Scrivi il contenuto desiderato nel file vuoto

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

È stato utile?

Soluzione

Per sovrascrivere il file 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();

Altri suggerimenti

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 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);

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

Vedi: java.io.RandomAccessFile

Ti consigliamo di aprire un file di lettura-scrittura, quindi:

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");

A meno che tu non stia semplicemente aggiungendo contenuti alla fine, è ragionevole farlo in quel modo. Se stai aggiungendo, prova FileWriter con il costruttore append.

Un ordine leggermente migliore sarebbe:

  1. Genera nuovo nome file (ad esempio foo.txt.new)
  2. Scrivi il contenuto aggiornato nel nuovo file.
  3. Rinomina atomicamente da foo.txt.new a foo.txt

Sfortunatamente, renameTo è non garantito per rinominare atomicamente.

Nell'esempio seguente, il "quot" falso " fa sì che il file venga sovrascritto, true causerebbe 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(); 

Ci sono momenti in cui si potrebbe voler mantenere un enorme file vuoto in modo da evitare costi aggiuntivi del sistema operativo che alloca spazio in base alle necessità. Ciò viene generalmente eseguito da database, macchine virtuali e anche in programmi batch che elaborano e scrivono dati in blocco. Ciò migliorerebbe significativamente le prestazioni dell'applicazione. In questi casi, scrivere un nuovo file e rinominarlo non sarebbe davvero d'aiuto. Invece, il file vuoto dovrà essere riempito. Questo è quando uno deve andare per la modalità di override.

Guava File.write " Sovrascrive un file con il contenuto di una matrice di byte " ;:

Files.write(bytes, new File(path));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top