Il semble qu'il existe différentes façons de lire et d'écrire des données de fichiers en Java.
Je veux lire les données ASCII d'un fichier. Quelles sont les méthodes possibles et leurs différences ?
Ma méthode préférée pour lire un petit fichier est d'utiliser un BufferedReader et un StringBuilder. C'est très simple et direct (bien que pas particulièrement efficace, mais suffisant pour la plupart des cas) :
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
try {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
String everything = sb.toString();
} finally {
br.close();
}
Certains ont fait remarquer qu'après Java 7, vous devriez utiliser try-with-resources (c'est-à-dire la fermeture automatique) :
try(BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {
StringBuilder sb = new StringBuilder();
String line = br.readLine();
while (line != null) {
sb.append(line);
sb.append(System.lineSeparator());
line = br.readLine();
}
String everything = sb.toString();
}
Lorsque je lis des chaînes de caractères comme celle-ci, je veux généralement effectuer une manipulation de chaîne de caractères par ligne de toute façon, alors j'opte pour cette implémentation.
Cependant, si je veux simplement lire un fichier dans une chaîne, j'utilise toujours Apache [Commons IO][1] avec la méthode de la classe IOUtils.toString(). Vous pouvez consulter les sources ici :
http://www.docjar.com/html/api/org/apache/commons/io/IOUtils.java.html
FileInputStream inputStream = new FileInputStream("foo.txt");
try {
String everything = IOUtils.toString(inputStream);
} finally {
inputStream.close();
}
Et encore plus simple avec Java 7 :
try(FileInputStream inputStream = new FileInputStream("foo.txt")) {
String everything = IOUtils.toString(inputStream);
// do something with everything string
}
ASCII est un fichier TEXTE, vous utiliserez donc [Readers
][1] pour la lecture. Java prend également en charge la lecture d'un fichier binaire en utilisant [InputStreams
][2]. Si les fichiers à lire sont énormes, il est préférable d'utiliser un [BufferedReader
][3] en plus d'un [FileReader
][4] pour améliorer les performances de lecture.
Consultez [cet article][5] pour savoir comment utiliser un Reader
.
Je vous recommande également de télécharger et de lire ce merveilleux livre (pourtant gratuit) intitulé [Thinking In Java][6].
En Java 7 :
new String(Files.readAllBytes(...))
[(docs)][7] ou
Files.readAllLines(...)
[(docs)][8]
En Java 8 :
Files.lines(..).forEach(...)
[(docs)][9]
[1] : http://docs.oracle.com/javase/7/docs/api/java/io/Reader.html [2] : http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html [3] : http://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html [4] : http://docs.oracle.com/javase/7/docs/api/java/io/FileReader.html [5] : http://www.javapractices.com/topic/TopicAction.do?Id=42 [6] : https://www.mindviewllc.com/quicklinks/#java [7] : http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#readAllBytes%28java.nio.file.Path%29 [8] : http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#readAllLines%28java.nio.file.Path,%20java.nio.charset.Charset%29 [9] : http://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#lines-java.nio.file.Path-
Le moyen le plus simple est d'utiliser la classe Scanner
en Java et l'objet FileReader. Exemple simple :
Scanner in = new Scanner(new FileReader("filename.txt"));
Scanner
possède plusieurs méthodes pour lire des chaînes de caractères, des nombres, etc... Vous pouvez chercher plus d'informations à ce sujet sur la page de documentation de Java.
Par exemple, lire le contenu entier dans une String
:
StringBuilder sb = new StringBuilder();
while(in.hasNext()) {
sb.append(in.next());
}
in.close();
outString = sb.toString();
De même, si vous avez besoin d'un encodage spécifique, vous pouvez utiliser cette fonction au lieu de FileReader
:
new InputStreamReader(new FileInputStream(fileUtf8), StandardCharsets.UTF_8)