2009-06-19 7 views
36

Je souhaite réécrire le contenu d'un fichier.Est-ce le meilleur moyen de réécrire le contenu d'un fichier en Java?

Ce que j'ai pensé à ce jour est la suivante:

  1. Enregistrer le nom du fichier
  2. Supprimer le fichier existant
  3. Créer un nouveau fichier vide avec le même nom
  4. écrire le contenu désiré vers le fichier vide

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

Répondre

70

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 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: oui. Cela dépend si vous écrivez des chaînes ou des éléments binaires en octets pour savoir si vous utiliseriez l'approche OutputStream ou Writer. – Stobor

+0

Existe-t-il une méthode disponible pour l'auteur de pdf de dossier sans changer son nom? – BobDroid

+0

@BabuThangavel Je ne suis pas sûr de ce que vous demandez, mais il ne semble pas que ce soit lié à cette question ... Peut-être que vous voulez poser une nouvelle question? – Stobor

2

Sauf si vous êtes juste d'ajouter du contenu à la fin, il est raisonnable de le faire de cette façon. Si vous ajoutez, essayez FileWriter avec le constructeur append.

Un peu mieux pour serait:

  1. Générer un nouveau nom de fichier (par exemple foo.txt.new)
  2. Ecrire un contenu mis à jour au nouveau fichier.
  3. atomique de ne pas renommer foo.txt.new à toto.txt

Malheureusement, renameTo est not guaranteed faire renommage atomique.

4

Voir: java.io.RandomAccessFile

Vous voulez 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"); 
+0

J'ai mal lu la question que le besoin de réécrire un fichier, par exemple. modifier le contenu, ne pas remplacer entièrement avec du nouveau contenu. – drfloob

+0

Soit résoudre le problème :) – Ankur

+0

Quoi qu'il en soit, je cherchais à écraser une partie spécifique du fichier et ce fut la réponse! – fyts

1

Dans l'exemple ci-dessous, la « false », le fichier à écraser, serait vrai provoque 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

Curieux! Quel est l'avantage d'introduire DataOutputSteam? –

+0

Les méthodes size() et writeUTF() m'ont été utiles jusqu'ici, j'ai donc choisi de l'utiliser. Vous ne pouvez également pas convertir en octets avant d'écrire la chaîne à l'aide de DataOutputStream. – Sev

+0

DataInputStream et DataOutputStream sont des classes spécialisées pour travailler avec un certain type de fichier binaire; ils ne devraient pas être utilisés sur des fichiers texte. La manière correcte de lire et d'écrire des fichiers texte est avec Readers and Writers: FileReader et FileWriter utilisent l'encodage par défaut de la plateforme, tandis que InputStreamReader et OutputStreamWriter vous permettent de spécifier l'encodage (comme UTF-8). –

10

Je recommande fortement d'utiliser le FileUtil d'Apache Common pour cela. J'ai trouvé ce paquet 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 à l'adresse: http://commons.apache.org/io/api-release/org/apache/commons/io/FileUtils.html

1

Il y a des moments où l'on peut vouloir garder un énorme fichier vide afin d'éviter des frais supplémentaires de l'OS allocation d'espace sur la base de besoins. Ceci est généralement effectué par des bases de données, des machines virtuelles et également dans des programmes batch 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 ne serait pas vraiment utile. Au lieu de cela, le fichier vide devra être rempli. C'est quand on doit aller pour le mode prioritaire.

1

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

Files.write(bytes, new File(path)); 
Questions connexes