相当于InputStream或Reader的Files.readAllLines()?

问题描述 投票:0回答:2

我有一个文件,我已经通过以下方法将其读入列表中:

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

是否有任何好的(单行)Java 7/8/nio2 方法可以使用可执行 Jar 内的文件实现相同的功能(并且大概必须使用 InputStream 读取)?也许是一种通过类加载器打开 InputStream 的方法,然后以某种方式强制/转换/包装它到 Path 对象中?或者某些包含与 File.readAllLines(...) 等效的 InputStream 或 Reader 的新子类?

我知道我可以用传统的方式用半页代码或通过一些外部库来完成它......但在我这样做之前,我想确保最近发布的Java不能“完成”盒子的”。

java jar nio2
2个回答
92
投票

InputStream
表示字节流。这些字节不一定形成可以逐行读取的(文本)内容。

如果您知道

InputStream
可以解释为文本,则可以将其包装在
InputStreamReader
中并使用
BufferedReader#lines()
逐行使用它。

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());
    // ...
}

45
投票

您可以使用 Apache Commons IOUtils#readLines:

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

© www.soinside.com 2019 - 2024. All rights reserved.