等效于 Files.readAllLines() for InputStream or Reader?

2022-08-31 17:10:47

我有一个文件,我一直在通过以下方法读取到列表中:

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读取)?也许是一种通过类加载器打开输入流的方法,然后以某种方式强制/转换/包装到Path对象中?或者 InputStream 或 Reader 的某个新子类,其中包含与 File.readAllLines(...) 等效的子类?

我知道我可以用传统的方式在半页的代码中做到这一点,或者通过一些外部库......但是在我这样做之前,我想确保最近发布的Java不能“开箱即用”。


答案 1

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

如果您知道 可以将其解释为文本,则可以将其换行,并使用 BufferedReader#lines() 逐行使用它。InputStreamInputStreamReader

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

答案 2

您可以使用Apache Commons IOUtils#readLines

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


推荐