Question

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

Ce à quoi j'ai pensé jusqu'à présent, c'est ceci:

  1. Enregistrez le nom du fichier
  2. Supprimer le fichier existant
  3. Créer un nouveau fichier vide portant le même nom
  4. Ecrivez le contenu souhaité dans le fichier vide

Est-ce le meilleur moyen? Ou bien existe-t-il un moyen plus direct, qui consiste à ne pas avoir à supprimer et à créer des fichiers, mais simplement à en modifier le contenu?

Était-ce utile?

La solution

Pour écraser 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();

Autres conseils

Je vous recommande fortement d'utiliser FileUtil pour Apache Common. J'ai trouvé ce forfait inestimable. Il est facile à utiliser et, tout aussi important, à lire et à comprendre facilement lorsque vous revenez en arrière 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 sur: http://commons.apache.org/io /api-release/org/apache/commons/io/FileUtils.html

Voir: java.io.RandomAccessFile.html" rel="noreferrer"> 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");

Sauf si vous ajoutez simplement du contenu à la fin, il est raisonnable de le faire de cette façon. Si vous ajoutez des modifications, essayez FileWriter avec le constructeur append.

Un ordre légèrement meilleur serait:

  1. Générer un nouveau nom de fichier (par exemple, foo.txt.new)
  2. Écrire le contenu mis à jour dans un nouveau fichier.
  3. Renommer atomiquement de foo.txt.nouveau en foo.txt

Malheureusement, renameTo est non garanti pour le renommage atomique.

Dans l'exemple ci-dessous, le "faux" le fichier est écrasé, 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(); 

Il arrive parfois que l'on souhaite conserver un fichier de grande taille afin d'éviter des coûts supplémentaires liés à l'allocation d'espace au système d'exploitation sur la base des besoins. Ceci est généralement effectué par les bases de données, les machines virtuelles et également par les programmes de traitement par lots qui traitent et écrivent des données en vrac. 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 à ce moment-là qu’il faut passer au mode de substitution.

Goyave File.write &"; Remplace un fichier avec le contenu d'un tableau d'octets ":

Files.write(bytes, new File(path));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top