2015-03-26 6 views
18

Mam plik, który czytałem na listę poprzez następującą metodę:odpowiednik Files.readAllLines() dla InputStream lub Reader?

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

Czy istnieje jakiś ładny (pojedyncza linia) Java 7/8/nio2 sposób zdjąć z tego samego wyczynu plik, który znajduje się wewnątrz wykonywalnego słoika (i prawdopodobnie należy go odczytać za pomocą InputStream)? Być może sposób, aby otworzyć InputStream za pośrednictwem programu ładującego klasy, a następnie w jakiś sposób wymusić/przekształcić/zawinąć go do obiektu Path? Lub jakiejś nowej podklasy InputStream lub Reader, która zawiera odpowiednik File.readAllLines (...)?

Wiem, że mogę może zrobić to w tradycyjny sposób na pół strony kodu, lub za pośrednictwem jakiejś biblioteki zewnętrznej ... ale zanim to zrobię, chcę się upewnić, że ostatnie wydania Java nie mogą już zrobić to "po wyjęciu z pudełka".

+0

Dlaczego nie (chce) pozostać przy obecnym rozwiązaniu? – Loki

+0

Obecne rozwiązanie działa tylko tak długo, jak aplikacja działa w systemie IntelliJ i na moim komputerze. To działa dzisiaj, ale ostatecznie musi być w stanie uruchomić z pliku wykonywalnego Jarfile. – Bitbang3r

Odpowiedz

34

Numer InputStream reprezentuje strumień bajtów. Te bajty niekoniecznie tworzą treść (tekstową), którą można czytać wiersz po wierszu.

Jeśli wiesz, że InputStream można interpretować jako tekst, możesz zawinąć go w InputStreamReader i użyć BufferedReader#lines(), aby pochłonąć linię po linii.

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

Nie ma koncepcji "linii" dla InputStream, dotyczy tylko bajtów. Tylko Czytelnicy mają linie. –