Quelle est la manière la plus simple de créer et d'écrire dans un fichier (texte) en Java?
1383
Notez que chacun des exemples de code ci-dessous peut lancer IOException
. Les blocs try / catch / finally ont été omis par souci de concision. Consultez ce didacticiel pour plus d'informations sur la gestion des exceptions.
Notez que chacun des exemples de code ci-dessous écrasera le fichier s'il existe déjà
Création d'un fichier texte:
PrintWriter writer = new PrintWriter("the-file-name.txt", "UTF-8");
writer.println("The first line");
writer.println("The second line");
writer.close();
Création d'un fichier binaire:
byte data[] = ...
FileOutputStream out = new FileOutputStream("the-file-name");
out.write(data);
out.close();
Les utilisateurs de Java 7+ peuvent utiliser la Files
classe pour écrire dans des fichiers:
Création d'un fichier texte:
List<String> lines = Arrays.asList("The first line", "The second line");
Path file = Paths.get("the-file-name.txt");
Files.write(file, lines, StandardCharsets.UTF_8);
//Files.write(file, lines, StandardCharsets.UTF_8, StandardOpenOption.APPEND);
Création d'un fichier binaire:
byte data[] = ...
Path file = Paths.get("the-file-name");
Files.write(file, data);
//Files.write(file, data, StandardOpenOption.APPEND);
"PrintWriter prints formatted representations of objects to a text-output stream. "
la réponse de Bozho est plus correcte, même si elle semble lourde (vous pouvez toujours l'envelopper dans une méthode utilitaire).writer.close()
devrait être dans un bloc enfinEn Java 7 et supérieur:
Il existe cependant des utilitaires utiles pour cela:
Notez également que vous pouvez utiliser a
FileWriter
, mais il utilise l'encodage par défaut, ce qui est souvent une mauvaise idée - il est préférable de spécifier explicitement l'encodage.Vous trouverez ci-dessous la réponse originale antérieure à Java 7
Voir aussi: Lecture, écriture et création de fichiers (inclut NIO2).
la source
close()
sur n'importe quel flux enroulé autour d'un autre fermera également tous les flux internes.Si vous avez déjà le contenu que vous souhaitez écrire dans le fichier (et non généré à la volée), l'
java.nio.file.Files
ajout dans Java 7 dans le cadre des E / S natives fournit le moyen le plus simple et le plus efficace pour atteindre vos objectifs.Fondamentalement, la création et l'écriture dans un fichier se fait sur une seule ligne, en plus un simple appel de méthode !
L'exemple suivant crée et écrit dans 6 fichiers différents pour montrer comment il peut être utilisé:
la source
la source
output.close()
lance IOExceptionVoici un petit exemple de programme pour créer ou écraser un fichier. C'est la version longue donc elle peut être comprise plus facilement.
la source
Un moyen très simple de créer et d'écrire dans un fichier en Java:
la source
File.exists()/createNewFile()
code ici est à la fois inutile et inutile. Le système d'exploitation doit déjà faire exactement la même chose lors de sanew FileWriter()
création. Vous forcez tout cela à se produire deux fois.FileWriter
comme suit:new FileWriter(file.getAbsoluteFile(),true)
Utilisation:
L'utilisation
try()
fermera automatiquement le flux. Cette version est courte, rapide (tamponnée) et permet de choisir l'encodage.Cette fonctionnalité a été introduite dans Java 7.
la source
StandardCharsets.UTF_8
au lieu de la chaîne "utf-8" (cela évite les fautes de frappe)...new OutputStreamWriter(new FileOutputStream("myFile.txt"), StandardCharsets.UTF_8)...
-java.nio.charset.StandardCharsets
est introduit dans java 7Ici, nous entrons une chaîne dans un fichier texte:
Nous pouvons facilement créer un nouveau fichier et y ajouter du contenu.
la source
Étant donné que l'auteur n'a pas précisé s'ils ont besoin d'une solution pour les versions Java qui ont été EoL (par Sun et IBM, et ce sont techniquement les JVM les plus répandues), et en raison du fait que la plupart des gens semblent avoir répondu à la question de l'auteur avant qu'il ne soit précisé qu'il s'agit d'un fichier texte (non binaire) , j'ai décidé d'apporter ma réponse.
Tout d'abord, Java 6 a généralement atteint la fin de sa vie, et comme l'auteur n'a pas précisé qu'il a besoin d'une compatibilité héritée, je suppose que cela signifie automatiquement Java 7 ou supérieur (Java 7 n'est pas encore en fin de vie par IBM). Ainsi, nous pouvons regarder à droite le didacticiel d'E / S de fichiers: https://docs.oracle.com/javase/tutorial/essential/io/legacy.html
Eh bien, cela exclut java.io.File. Si un fichier ne peut pas être écrit / ajouté, vous ne pourrez peut-être même pas savoir pourquoi.
Nous pouvons continuer à regarder le tutoriel: https://docs.oracle.com/javase/tutorial/essential/io/file.html#common
Si vous avez toutes les lignes que vous écrirez (ajouterez) au fichier texte à l'avance , l'approche recommandée est https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html# write-java.nio.file.Path-java.lang.Iterable-java.nio.charset.Charset-java.nio.file.OpenOption ...-
Voici un exemple (simplifié):
Un autre exemple (en annexe):
Si vous souhaitez écrire le contenu du fichier au fur et à mesure : https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#newBufferedWriter-java.nio.file.Path-java .nio.charset.Charset-java.nio.file.OpenOption ...-
Exemple simplifié (Java 8 ou supérieur):
Un autre exemple (en annexe):
Ces méthodes nécessitent un effort minimal de la part de l'auteur et doivent être préférées à toutes les autres lors de l'écriture dans des fichiers [texte].
la source
FileNotFoundException
qui est lancé lorsque l'opération échoue.Si vous souhaitez vivre une expérience relativement indolore, vous pouvez également consulter le package Apache Commons IO , plus précisément la
FileUtils
classe .N'oubliez jamais de vérifier les bibliothèques tierces. Joda-Time pour la manipulation de date, Apache Commons Lang
StringUtils
pour les opérations de chaîne courantes et ainsi de suite peut rendre votre code plus lisible.Java est un excellent langage, mais la bibliothèque standard est parfois un peu bas niveau. Puissant, mais de bas niveau néanmoins.
la source
FileUtils
eststatic void write(File file, CharSequence data)
. Exemple d' utilisation:import org.apache.commons.io.FileUtils;
FileUtils.write(new File("example.txt"), "string with data");
.FileUtils
a égalementwriteLines
, qui prend uneCollection
des lignes.Si pour une raison quelconque vous voulez séparer l'acte de créer et d'écrire, l'équivalent Java de
touch
estcreateNewFile()
vérifie l'existence et crée un fichier de manière atomique. Cela peut être utile si vous voulez vous assurer que vous avez été le créateur du fichier avant d'y écrire, par exemple.la source
touch
dans le sens général mais plutôt dans son usage secondaire courant pour créer un fichier sans y écrire de données. L'objectif documenté de touch est de mettre à jour l'horodatage du fichier. La création du fichier s'il n'existe pas est vraiment l'effet secondaire et peut être désactivée avec un interrupteur.exists()/createNewFile()
séquences sont littéralement une perte de temps et d'espace.Voici quelques-unes des façons possibles de créer et d'écrire un fichier en Java:
Utilisation de FileOutputStream
Utilisation de FileWriter
Utilisation de PrintWriter
Utilisation de OutputStreamWriter
Pour plus d'informations, consultez ce didacticiel sur la lecture et l'écriture de fichiers en Java .
la source
FileWriter
ou ne devrait-il pasOutputStreamWriter
être fermé dans un bloc enfin?Utilisation:
la source
la meilleure façon est d'utiliser Java7: Java 7 introduit une nouvelle façon de travailler avec le système de fichiers, ainsi qu'une nouvelle classe d'utilitaires - Files. En utilisant la classe Files, nous pouvons également créer, déplacer, copier, supprimer des fichiers et des répertoires; il peut également être utilisé pour lire et écrire dans un fichier.
Écrire avec FileChannel Si vous traitez de gros fichiers, FileChannel peut être plus rapide que les E / S standard. Le code suivant écrit String dans un fichier à l'aide de FileChannel:
Écrire avec DataOutputStream
Écrire avec FileOutputStream
Voyons maintenant comment utiliser FileOutputStream pour écrire des données binaires dans un fichier. Le code suivant convertit une chaîne en octets int et écrit les octets dans un fichier à l'aide d'un FileOutputStream:
Écrivez avec PrintWriter, nous pouvons utiliser un PrintWriter pour écrire du texte formaté dans un fichier:
Écrire avec BufferedWriter: utilisez BufferedWriter pour écrire une chaîne dans un nouveau fichier:
ajoutez une chaîne au fichier existant:
la source
Je pense que c'est le chemin le plus court:
la source
Pour créer un fichier sans écraser le fichier existant:
la source
la source
exists()/createNewFile()
séquences sont littéralement une perte de temps et d'espace.la source
exists()/createNewFile()
séquences sont littéralement une perte de temps et d'espace.Une seule ligne!
path
etline
sont des cordesla source
lines
. Si c'est unjava.lang.String
, alors l'appelgetBytes()
produira des octets en utilisant le codage par défaut de la plateforme , ce qui n'est pas très bon dans le cas général.La façon la plus simple que je puisse trouver:
Cela ne fonctionnera probablement que pour 1.7+.
la source
Cela vaut la peine d'essayer pour Java 7+:
Cela semble prometteur ...
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
Lecture et écriture de fichiers en utilisant le flux d'entrée et de sortie:
la source
Incluez simplement ce package:
Et puis vous pouvez utiliser ce code pour écrire le fichier:
la source
En Java 8, utilisez Fichiers et chemins et utilisez la construction try-with-resources.
la source
Il existe des moyens simples, comme:
la source
bw
n'est pas utilisé.Vous pouvez même créer un fichier temporaire à l'aide d'une propriété système , qui sera indépendante du système d'exploitation que vous utilisez.
la source
En utilisant la bibliothèque Google Guava, nous pouvons créer et écrire dans un fichier très facilement.
L'exemple crée un nouveau
fruits.txt
fichier dans le répertoire racine du projet.la source
Lecture de la collection avec les clients et enregistrement dans un fichier, avec JFilechooser.
la source
Il existe au moins plusieurs façons de créer un fichier et d'y écrire:
Petits fichiers (1.7)
Vous pouvez utiliser l'une des méthodes d'écriture pour écrire des octets ou des lignes dans un fichier.
Ces méthodes prennent en charge la plupart du travail pour vous, telles que l'ouverture et la fermeture du flux, mais ne sont pas destinées à gérer des fichiers volumineux.
Écriture d'un fichier plus volumineux à l'aide d'E / S de flux mis en mémoire tampon (1.7)
Le
java.nio.file
package prend en charge les E / S de canal, qui déplacent les données dans des tampons, contournant certaines des couches qui peuvent goulot d'étranglement des E / S de flux.Cette approche est préférentielle en raison de ses performances efficaces, en particulier lors de l'achèvement d'un grand nombre d'opérations d'écriture. Les opérations tamponnées ont cet effet car elles ne sont pas obligées d'appeler la méthode d'écriture du système d'exploitation pour chaque octet, ce qui réduit les opérations d'E / S coûteuses.
Utilisation de l'API NIO pour copier (et en créer un nouveau) un fichier avec un flux de sortie (1.7)
Il existe également des méthodes supplémentaires qui permettent de copier tous les octets d'un flux d'entrée dans un fichier.
FileWriter (texte) (<1.7)
Écrit directement dans le fichier (moins de performances) et ne doit être utilisé que lorsque le nombre d'écritures est inférieur. Utilisé pour écrire des données orientées caractères dans un fichier.
FileOutputStream (binaire) (<1.7)
FileOutputStream est destiné à l'écriture de flux d'octets bruts tels que des données d'image.
Avec cette approche, il faut envisager de toujours écrire un tableau d'octets plutôt que d'écrire un octet à la fois. L'accélération peut être assez importante - jusqu'à 10 fois plus ou plus. Par conséquent, il est recommandé d'utiliser les
write(byte[])
méthodes autant que possible.la source