Je veux réécrire le contenu d'un fichier.
Ce à quoi j'ai pensé jusqu'à présent:
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?
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();
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
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");
À 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:
Malheureusement, renameTo est non garanti pour faire un renommage atomique.
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.
GuavaFile.write "Remplace un fichier avec le contenu d'un tableau d'octets":
Files.write(bytes, new File(path));
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();