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

Posted

技术标签:

【中文标题】相当于 InputStream 或 Reader 的 Files.readAllLines()?【英文标题】:equivalent to Files.readAllLines() for InputStream or Reader? 【发布时间】:2015-05-30 16:55:39 【问题描述】:

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

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 可以'还没有“开箱即用”。

【问题讨论】:

你为什么不(想)坚持你目前的解决方案? 当前的解决方案只有在应用程序在 IntelliJ 和我自己的计算机上运行时才有效。这在今天有效,但最终它必须能够从可执行的 Jarfile 运行。 【参考方案1】:

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());

【讨论】:

【参考方案2】:

您可以使用 Apache Commons IOUtils#readLines:

List&lt;String&gt; doc = IOUtils.readLines(inputStream, StandardCharsets.UTF_8);

【讨论】:

以上是关于相当于 InputStream 或 Reader 的 Files.readAllLines()?的主要内容,如果未能解决你的问题,请参考以下文章

Reader 和 InputStream 有啥区别?

InputStream,InputStreamReader和Reader的关系

InputStream和Reader

inputstream,inputstreamreader,与reader的关系

Java中InputStream与Reader的区别

InputStream,String和Reader之间的转换