2015-03-26 18 views
18

Ho un file che ho letto in un elenco tramite il seguente metodo:equivalente a Files.readAllLines() per InputStream o Reader?

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

C'è un bel (monolinea) Java 7/8/nio2 modo per tirare fuori l'impresa stessa con un file che si trova all'interno di un Jar eseguibile (e presumibilmente, deve essere letto con un InputStream)? Forse un modo per aprire un InputStream tramite il classloader, quindi in qualche modo costringerlo/trasformarlo/avvolgerlo in un oggetto Path? O qualche nuova sottoclasse di InputStream o Reader che contiene un equivalente a File.readAllLines (...)?

Io so che potrebbe possibile fare in modo tradizionale in una mezza pagina di codice o tramite una libreria esterna ... ma prima di farlo, voglio essere sicuro che le versioni recenti di Java non possano già fare è "fuori dalla scatola".

+0

perché non (vuole) stare con la vostra soluzione attuale? – Loki

+0

La soluzione corrente funziona solo finché l'app è in esecuzione in IntelliJ e sul mio computer. Funziona oggi, ma alla fine deve essere in grado di eseguire da un Jarfile eseguibile. – Bitbang3r

risposta

34

Un InputStream rappresenta un flusso di byte. Questi byte non formano necessariamente contenuti (di testo) che possono essere letti riga per riga.

Se si sa che il InputStream può essere interpretato come testo, è possibile inserirlo in un InputStreamReader e utilizzare BufferedReader#lines() per consumarlo linea per linea.

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

Non esiste un concetto di "linee" per un InputStream, si occupa solo dei byte. Solo i lettori hanno linee. –

10

È possibile utilizzare Apache Commons IOUtils#readLines:

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