web-dev-qa-db-fra.com

Est-ce la meilleure façon de réécrire le contenu d'un fichier en Java?

Je veux réécrire le contenu d'un fichier.

Ce à quoi j'ai pensé jusqu'à présent:

  1. Enregistrez le nom du fichier
  2. Supprimer le fichier existant
  3. Créez un nouveau fichier vide avec le même nom
  4. Écrivez le contenu souhaité dans le fichier vide

Est-ce la meilleure façon? Ou existe-t-il un moyen plus direct, c'est-à-dire de ne pas avoir à supprimer et créer des fichiers, mais simplement à modifier le contenu?

44
Ankur

Pour remplacer le fichier foo.log avec 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();

ou avec 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();
81
Stobor

Je recommande fortement d'utiliser FileUtil d'Apache Common pour cela. J'ai trouvé ce package inestimable. Il est facile à utiliser et tout aussi important, il est facile à lire/comprendre lorsque vous revenez un peu plus tard.

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

Plus d'informations peuvent être trouvées sur: http://commons.Apache.org/io/api-release/org/Apache/commons/io/FileUtils.html

12
jnt30

Voir: Java.io.RandomAccessFile

Vous voudrez ouvrir un fichier en lecture-écriture, donc:

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

À moins que vous ajoutiez simplement du contenu à la fin, il est raisonnable de le faire de cette façon. Si vous ajoutez, essayez FileWriter avec le constructeur append.

Un ordre légèrement meilleur serait:

  1. Générez un nouveau nom de fichier (par exemple foo.txt.new)
  2. Écrivez le contenu mis à jour dans un nouveau fichier.
  3. Renommez atomique de foo.txt.new à foo.txt

Malheureusement, renameTo est non garanti pour faire un renommage atomique.

2
Matthew Flaschen

Il y a des moments où l'on peut vouloir garder un énorme fichier vide afin d'éviter le coût supplémentaire de l'OS allouant de l'espace en fonction des besoins. Cela se fait généralement par des bases de données, des machines virtuelles et également dans des programmes de traitement par lots qui traitent et écrivent des données en masse. Cela améliorerait considérablement les performances de l'application. Dans ces cas, écrire un nouveau fichier et le renommer n'aiderait pas vraiment. Au lieu de cela, le fichier vide devra être rempli. C'est alors qu'il faut opter pour le mode prioritaire.

1
Lakshmi

GuavaFile.write "Remplace un fichier avec le contenu d'un tableau d'octets":

Files.write(bytes, new File(path));
1
Vadzim

Dans l'exemple ci-dessous, le "faux" entraîne l'écrasement du fichier, true provoquerait le contraire.

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
Sev