web-dev-qa-db-fra.com

équivalent à Files.readAllLines () pour InputStream ou Reader?

J'ai un fichier que j'ai lu dans une liste via la méthode suivante:

List<String> doc = Java.nio.file.Files.readAllLines(new File("/path/to/src/resources/citylist.csv").toPath(), StandardCharsets.UTF_8);

Existe-t-il une méthode Nice (une seule ligne) Java 7/8/nio2 pour réaliser le même exploit avec un fichier qui se trouve dans un Jar exécutable (et qui doit probablement être lu avec un InputStream )? Peut-être un moyen d'ouvrir un InputStream via le chargeur de classe, puis de le forcer/le transformer/envelopper en un objet Path? Ou une nouvelle sous-classe de InputStream ou Reader qui contient un équivalent de File.readAllLines (...)?

Je sais que je pourrais le faire de manière traditionnelle sur une demi-page de code, ou via une bibliothèque externe ... mais avant de le faire, je veux m'assurer que les versions récentes de Java ne peut pas déjà le faire "prêt à l'emploi".

37
Bitbang3r

Un InputStream représente un flux d'octets. Ces octets ne forment pas nécessairement un contenu (texte) qui peut être lu ligne par ligne.

Si vous savez que le InputStream peut être interprété comme du texte, vous pouvez l'envelopper dans un InputStreamReader et utiliser BufferedReader#lines() pour le consommer ligne par ligne.

try (InputStream resource = Example.class.getResourceAsStream("resource")) {
  List<String> doc =
      new BufferedReader(new InputStreamReader(resource,
          StandardCharsets.UTF_8)).lines().collect(Collectors.toList());
}
54

Vous pouvez utiliser Apache Commons IOUtils # readLines :

List<String> doc = IOUtils.readLines(inputStream, StandardCharsets.UTF_8);

23
splintor