equivalent to Files.readAllLines() for InputStream or Reader?
Asked Answered
O

2

65

I have a file that I've been reading into a List via the following method:

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

Is there any nice (single-line) Java 7/8/nio2 way to pull off the same feat with a file that's inside an executable Jar (and presumably, has to be read with an InputStream)? Perhaps a way to open an InputStream via the classloader, then somehow coerce/transform/wrap it into a Path object? Or some new subclass of InputStream or Reader that contains an equivalent to File.readAllLines(...)?

I know I could do it the traditional way in a half page of code, or via some external library... but before I do, I want to make sure that recent releases of Java can't already do it "out of the box".

Opia answered 26/3, 2015 at 15:25 Comment(2)
Why don't you (want to) stay with your current solution?Mcmichael
The current solution only works as long as the app is running inside IntelliJ and on my own computer. That works today, but ultimately it has to be able to run from an executable Jarfile.Opia
S
96

An InputStream represents a stream of bytes. Those bytes don't necessarily form (text) content that can be read line by line.

If you know that the InputStream can be interpreted as text, you can wrap it in a InputStreamReader and use BufferedReader#lines() to consume it line by line.

try (InputStream resource = Example.class.getResourceAsStream("resource");
     InputStreamReader inputStreamReader = new InputStreamReader(resource, StandardCharsets.UTF_8);
     BufferedReader bufferedReader = new BufferedReader(inputStreamReader)) {
    List<String> doc = bufferedReader.lines().collect(Collectors.toList());
    // ...
}
Supat answered 26/3, 2015 at 15:31 Comment(0)
F
46

You can use Apache Commons IOUtils#readLines:

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

Forgive answered 22/2, 2016 at 9:25 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.