277 votes

Utils pour lire un fichier texte de ressources en String (Java)

Existe-t-il un utilitaire qui aide à lire un fichier texte dans la ressource en une chaîne de caractères. Je suppose que c'est une exigence populaire, mais je n'ai pas trouvé d'utilitaire après avoir cherché sur Google.

1 votes

Veuillez préciser ce que vous entendez par "fichier texte de la ressource" par rapport à "fichier texte dans la ressource" - il n'est pas facile de comprendre ce que vous essayez d'obtenir.

0 votes

C'est juste un fichier texte dans le classpath comme "classpath*:mytext/text.txt".

9 votes

Depuis java11, il existe une méthode spécifique pour cela : Files.readString(Paths.get(getClass().getResource("foo.txt")‌​.toURI()), Charset.forName("utf-8"))

330voto

Jon Skeet Points 692016

Oui, Goyave le prévoit dans le Resources classe. Par exemple :

URL url = Resources.getResource("foo.txt");
String text = Resources.toString(url, StandardCharsets.UTF_8);

24 votes

@JonSkeet C'est génial, mais pour les applications web, ce n'est peut-être pas la meilleure solution. getResource utilise Resource.class.getClassLoader mais dans les applications web, ce n'est peut-être pas "votre" chargeur de classes, il est donc recommandé (par exemple dans [1]) d'utiliser Thread.currentThread().getContextClassLoader().getResourceAs‌​Stream à la place (référence [1] : stackoverflow.com/questions/676250/ )

2 votes

@EranMedan : Oui, si vous voulez le classloader contextuel, vous devez l'utiliser explicitement.

7 votes

Dans le cas particulier où la ressource est à côté de votre classe, vous pouvez faire Resources.toString(MyClass.getResource("foo.txt"), Charsets.UTF_8) qui garantit l'utilisation du bon chargeur de classes.

213voto

akosicki Points 229

Vous pouvez utiliser l'ancien Astuce stupide du scanner oneliner pour le faire sans aucune dépendance supplémentaire comme guava :

String text = new Scanner(AppropriateClass.class.getResourceAsStream("foo.txt"), "UTF-8").useDelimiter("\\A").next();

Les gars, n'utilisez pas de matériel tiers sauf si vous en avez vraiment besoin. Il y a déjà beaucoup de fonctionnalités dans le JDK.

54 votes

Éviter le recours à des tiers est un principe raisonnable. Malheureusement, la bibliothèque centrale semble allergique à la modélisation des cas d'utilisation réels. Regardez les fichiers de Java 7, et dites-moi pourquoi tout lire à partir d'une ressource classpath n'a pas été inclus ? Ou au moins l'utilisation d'un "système de fichiers" standardisé.

4 votes

Est-il nécessaire - ou non - de fermer également le flux ? Guava ferme le flux en interne.

0 votes

Ça a marché à merveille pour moi aussi ! Je suis également d'accord avec la question de la tierce partie : Dans de nombreuses réponses, la réponse par défaut semble toujours être d'utiliser une bibliothèque tierce - que ce soit celle d'Apache ou d'un autre.

58voto

Stefan Endrullis Points 1217

yegor256 a trouvé un une belle solution utilisant Apache Commons IO :

import org.apache.commons.io.IOUtils;

String text = IOUtils.toString(this.getClass().getResourceAsStream("foo.xml"),
                               "UTF-8");

0 votes

Je préfère "" à ceci au cas où ceci ne serait pas disponible.

14 votes

Tout aussi compact, mais avec une fermeture correcte du flux d'entrée : IOUtils.toString(this.getClass().getResource("foo.xml"), "UTF-8") .

2 votes

Si cette solution ne fonctionne pas, essayez d'ajouter getClassLoader() à la chaîne de méthodes : String text = IOUtils.toString( getClass().getClassLoader().getResourceAsStream("foo.xml"), StandardCharsets.UTF_8);

55voto

Luciano Fiandesio Points 4795

Goyave possède une méthode "toString" pour lire un fichier dans une chaîne :

import com.google.common.base.Charsets;
import com.google.common.io.Files;

String content = Files.toString(new File("/home/x1/text.log"), Charsets.UTF_8);

Cette méthode ne nécessite pas que le fichier soit dans le classpath (comme dans la méthode Jon Skeet réponse précédente).

2 votes

Ou si c'est un flux d'entrée, guava a une bonne méthode pour cela aussi String stringFromStream = CharStreams.toString(new InputStreamReader(resourceAsStream, "UTF-8"));

1 votes

Cette fonction est obsolète dans la version 24.1 de Guava.

41voto

Andreas_D Points 64111

apache-commons-io a un nom d'utilité FileUtils :

URL url = Resources.getResource("myFile.txt");
File myFile = new File(url.toURI());

String content = FileUtils.readFileToString(myFile, "UTF-8");  // or any other encoding

2 votes

Pourquoi doit-on spécifier l'encodage, je ne comprends pas. Si je lis le fichier, je veux juste ce qu'il contient, il devrait déterminer l'encodage comme le fait mon éditeur. Lorsque j'ouvre le fichier dans Notepad ou ++, je ne lui indique pas quel encodage il doit utiliser. J'utilise cette méthode et ensuite writeStringToFile ... mais le contenu est différent. J'obtiens des tokens étranges dans le fichier cloné. Je ne comprends pas pourquoi je dois spécifier un encodage.

13 votes

@Hamidan, choisir le bon encodage est un algorithme très complexe. Il est souvent implémenté dans les éditeurs de texte, mais ils ne parviennent pas toujours à détecter le bon encodage. Je ne m'attendrais pas à ce qu'une API de lecture de fichiers intègre un algorithme aussi complexe pour lire mon fichier.

1 votes

@SecretService De plus, ces algorithmes utilisent des informations telles que la langue du système d'exploitation, la locale et d'autres paramètres régionaux, ce qui signifie que la lecture d'un fichier sans spécifier d'encodage peut fonctionner sur votre installation mais pas sur celle d'un autre utilisateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X