J'ai besoin d'ajouter du texte à plusieurs reprises à un fichier existant en Java. Comment je fais ça?
la source
J'ai besoin d'ajouter du texte à plusieurs reprises à un fichier existant en Java. Comment je fais ça?
Faites-vous cela à des fins de journalisation? Si c'est le cas, il existe plusieurs bibliothèques pour cela . Deux des plus populaires sont Log4j et Logback .
Si vous avez juste besoin de le faire une seule fois, la classe Files vous facilite la tâche:
try {
Files.write(Paths.get("myfile.txt"), "the text".getBytes(), StandardOpenOption.APPEND);
}catch (IOException e) {
//exception handling left as an exercise for the reader
}
Attention : l'approche ci-dessus lancera un NoSuchFileException
si le fichier n'existe pas déjà. Il n'ajoute pas non plus automatiquement une nouvelle ligne (ce que vous souhaitez souvent lors de l'ajout à un fichier texte). La réponse de Steve Chambers couvre comment vous pourriez faire cela avec la Files
classe.
Cependant, si vous écrivez plusieurs fois dans le même fichier, ce qui précède doit ouvrir et fermer le fichier sur le disque plusieurs fois, ce qui est une opération lente. Dans ce cas, un écrivain tamponné est préférable:
try(FileWriter fw = new FileWriter("myfile.txt", true);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter out = new PrintWriter(bw))
{
out.println("the text");
//more code
out.println("more text");
//more code
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
Remarques:
FileWriter
constructeur lui indiquera de s'ajouter au fichier, plutôt que d'écrire un nouveau fichier. (Si le fichier n'existe pas, il sera créé.)BufferedWriter
est recommandée pour un écrivain cher (comme FileWriter
).PrintWriter
vous donne accès à la println
syntaxe à laquelle vous êtes probablement habitué System.out
.BufferedWriter
et PrintWriter
ne sont pas strictement nécessaires.try {
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("myfile.txt", true)));
out.println("the text");
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
Si vous avez besoin d'une gestion des exceptions robuste pour les anciens Java, cela devient très détaillé:
FileWriter fw = null;
BufferedWriter bw = null;
PrintWriter out = null;
try {
fw = new FileWriter("myfile.txt", true);
bw = new BufferedWriter(fw);
out = new PrintWriter(bw);
out.println("the text");
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
finally {
try {
if(out != null)
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
try {
if(bw != null)
bw.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
try {
if(fw != null)
fw.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
}
new BufferedWriter(...)
lève une exception; Sera-t-FileWriter
il fermé? Je suppose qu'il ne sera pas fermé, car laclose()
méthode (dans des conditions normales) sera invoquée sur l'out
objet, qui dans ce cas ne sera pas initialisé - donc en fait laclose()
méthode ne sera pas invoquée -> le fichier sera ouvert, mais ne sera pas fermé. Donc, à mon humble avis, latry
déclaration devrait ressembler à cecitry(FileWriter fw = new FileWriter("myFile.txt")){ Print writer = new ....//code goes here }
Et il devraitflush()
l'écrivain avant de quitter letry
bloc !!!StandardOpenOption.APPEND
ne le créera pas - un peu comme un échec silencieux car il ne lèvera pas non plus d'exception. (2) L'utilisation.getBytes()
signifie qu'il n'y a pas de caractère de retour avant ou après le texte ajouté. Ont ajouté une réponse alternative pour y remédier.Vous pouvez utiliser
fileWriter
avec un indicateur défini surtrue
, pour l'ajout.la source
close
devrait être placé dans lefinally
bloc comme indiqué dans la réponse de @ etech au cas où une exception serait levée entre la création de FileWriter et l'invocation de close.try(FileWriter fw = new FileWriter(filename,true)){ // Whatever }catch(IOException ex){ ex.printStackTrace(); }
Toutes les réponses ici avec les blocs try / catch ne devraient-elles pas avoir les pièces .close () contenues dans un bloc finally?
Exemple de réponse marquée:
De plus, à partir de Java 7, vous pouvez utiliser une instruction try-with-resources . Aucun bloc enfin n'est requis pour fermer la ou les ressources déclarées car elles sont gérées automatiquement et sont également moins verbeuses:
la source
out
sort de la portée, il est automatiquement fermé lorsqu'il est récupéré, non? Dans votre exemple avec lefinally
bloc, je pense que vous avez réellement besoin d'un autre essai / rattrapage imbriquéout.close()
si je me souviens bien. La solution Java 7 est assez simple! (Je n'ai fait aucun développement Java depuis Java 6, donc je ne connaissais pas ce changement.)flush
méthode?Modifier - à partir d'Apache Commons 2.1, la bonne façon de le faire est:
J'ai adapté la solution de @ Kip pour inclure la fermeture correcte du fichier enfin:la source
Pour développer légèrement la réponse de Kip , voici une méthode Java 7+ simple pour ajouter une nouvelle ligne à un fichier, en la créant si elle n'existe pas déjà :
Remarque: ce qui précède utilise la
Files.write
surcharge qui écrit des lignes de texte dans un fichier (c'est-à-dire similaire à uneprintln
commande). Pour simplement écrire du texte à la fin (c'est-à-dire similaire à uneprint
commande), uneFiles.write
surcharge alternative peut être utilisée, en passant dans un tableau d'octets (par exemple"mytext".getBytes(StandardCharsets.UTF_8)
).la source
.CREATE
faire le travail pour toi.Assurez-vous que le flux est correctement fermé dans tous les scénarios.
Il est un peu alarmant de savoir combien de ces réponses laissent le descripteur de fichier ouvert en cas d'erreur. La réponse https://stackoverflow.com/a/15053443/2498188 est sur l'argent mais seulement parce
BufferedWriter()
qu'il ne peut pas lancer. Si c'était le cas, une exception laisserait l'FileWriter
objet ouvert.Une façon plus générale de faire cela, peu importe si
BufferedWriter()
peut lancer:Éditer:
Depuis Java 7, la méthode recommandée consiste à utiliser "essayer avec les ressources" et à laisser la JVM s'en occuper:
la source
PrintWriter.close()
n'est pas déclaré commethrows IOException
dans les documents . En regardant sa source , laclose()
méthode, en effet, ne peut pas lancerIOException
, car elle l'attrape du flux sous-jacent et définit un indicateur. Donc, si vous travaillez sur le code de la prochaine navette spatiale ou d'un système de mesure de dose de rayons X, vous devez l'utiliserPrintWriter.checkError()
après avoir essayéout.close()
. Cela aurait vraiment dû être documenté.XX.close()
devrait être dans son propre try / catch, non? Par exemple,out.close()
pourrait lever une exception, auquel casbw.close()
etfw.close()
ne serait jamais appelé, etfw
c'est celle qui est la plus critique à fermer.En Java-7, cela peut également être fait de la sorte:
// ---------------------
la source
java 7+
À mon humble avis puisque je suis fan de java ordinaire, je dirais que c'est une combinaison des réponses susmentionnées. Je suis peut-être en retard pour la fête. Voici le code:
Si le fichier n'existe pas, il le crée et s'il existe déjà, il ajoute le sampleText au fichier existant. Cela vous évite d'ajouter des bibliothèques inutiles à votre chemin de classe.
la source
Cela peut être fait sur une seule ligne de code. J'espère que cela t'aides :)
la source
Utilisation de java.nio. Fichiers avec java.nio.file. StandardOpenOption
Cela crée un
BufferedWriter
fichier à l'aide, qui accepte lesStandardOpenOption
paramètres, et un vidage automatiquePrintWriter
de la résultanteBufferedWriter
.PrintWriter
de »println()
la méthode, peut être appelé à écrire dans le fichier.Les
StandardOpenOption
paramètres utilisés dans ce code: ouvre le fichier pour l'écriture, l'ajoute uniquement au fichier et crée le fichier s'il n'existe pas.Paths.get("path here")
peut être remplacé parnew File("path here").toPath()
. EtCharset.forName("charset name")
peut être modifié pour accueillir le souhaitéCharset
.la source
J'ajoute juste un petit détail:
2. Le paramètre (true) est une fonctionnalité (ou interface) appelée appendable ( http://docs.oracle.com/javase/7/docs/api/java/lang/Appendable.html ). Il est responsable de pouvoir ajouter du contenu à la fin d'un fichier / flux particulier. Cette interface est implémentée depuis Java 1.5. Chaque objet (c.-à-d. BufferedWriter, CharArrayWriter, CharBuffer, FileWriter, FilterWriter, LogStream, OutputStreamWriter, PipedWriter, PrintStream, PrintWriter, StringBuffer, StringBuilder, StringWriter, Writer ) avec cette interface peut être utilisé pour ajouter du contenu
En d'autres termes, vous pouvez ajouter du contenu à votre fichier compressé ou un processus http
la source
Exemple, en utilisant la goyave:
la source
Essayez avec bufferFileWriter.append, cela fonctionne avec moi.
la source
cela fera ce que vous avez l'intention de faire ..
la source
Mieux vaut essayer avec des ressources que tout ce qui précède enfin Java 7
la source
Si nous utilisons Java 7 et supérieur et connaissons également le contenu à ajouter (ajouté) au fichier, nous pouvons utiliser la méthode newBufferedWriter dans le package NIO.
Il y a quelques points à noter:
StandardCharsets
.try-with-resource
instruction dans laquelle les ressources sont automatiquement fermées après l'essai.Bien que OP ne l'ait pas demandé, mais juste au cas où nous souhaiterions rechercher des lignes ayant un mot clé spécifique, par exemple,
confidential
nous pouvons utiliser des API de flux en Java:la source
write(String string)
si l'on s'attend à une nouvelle ligne après chaque chaîne écrite,newLine()
doit être appeléele vrai permet d'ajouter les données dans le fichier existant. Si nous écrivons
Il écrasera le fichier existant. Alors optez pour la première approche.
la source
la source
Attrapez ensuite une IOException quelque part en amont.
la source
Créez une fonction n'importe où dans votre projet et appelez simplement cette fonction là où vous en avez besoin.
Les gars, vous devez vous rappeler que vous appelez les threads actifs que vous n'appelez pas de manière asynchrone et que ce serait probablement de 5 à 10 pages pour le faire correctement. Pourquoi ne pas consacrer plus de temps à votre projet et oublier d'écrire tout ce qui a déjà été écrit. Correctement
trois lignes de code deux vraiment depuis la troisième ajoute réellement du texte. : P
la source
la source
Vous pouvez également essayer ceci:
la source
Je pourrais suggérer le projet Apache Commons . Ce projet fournit déjà un cadre pour faire ce dont vous avez besoin (c'est-à-dire un filtrage flexible des collections).
la source
La méthode suivante vous permet d'ajouter du texte à un fichier:
Vous pouvez également utiliser
FileUtils
:Ce n'est pas efficace mais fonctionne bien. Les sauts de ligne sont traités correctement et un nouveau fichier est créé s'il n'en existe pas encore.
la source
Ce code répondra à votre besoin:
la source
Dans le cas où vous souhaitez AJOUTER QUELQUE TEXTE DANS DES LIGNES SPÉCIFIQUES, vous pouvez d'abord lire le fichier entier, ajouter le texte où vous voulez, puis écraser tout comme dans le code ci-dessous:
la source
Ma réponse:
la source
la source
Vous pouvez utiliser le code suivant pour ajouter le contenu dans le fichier:
la source
1.7 Approche:
la source