等同于Files.readAllLines()用于InputStream或Reader的方法?

64

我有一个文件,我一直通过以下方法将其读入到List中:

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对象的方法?或者一些新的InputStream或Reader子类,其中包含等效于File.readAllLines(...)的内容?

我知道我可以用半页代码或通过一些外部库来实现传统的方法...但在这之前,我想确保最近的Java版本不能已经在“盒子外”完成它。


为什么您不想要继续使用当前的解决方案? - Loki
2
当前的解决方案只在应用程序在IntelliJ内部运行且在我的电脑上运行时才有效。这对今天来说是可行的,但最终必须能够从可执行的Jar文件中运行。 - Bitbang3r
2个回答

93

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

如果您知道InputStream可以被解释为文本,您可以将其包装在InputStreamReader中,并使用BufferedReader#lines()逐行消费它。

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

45
您可以使用Apache Commons IOUtils#readLines: < p > < code > List<String> doc = IOUtils.readLines(inputStream, StandardCharsets.UTF_8);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接