Java 8流到文件[重复]

Posted

技术标签:

【中文标题】Java 8流到文件[重复]【英文标题】:Java 8 stream to file [duplicate] 【发布时间】:2015-11-10 07:32:06 【问题描述】:

假设我有一个 java.util.stream.Stream 的对象和一些不错的 toString 方法: 将此流写入文件的最短/最优雅的解决方案是什么,每个流元素一行?

对于阅读,有很好的Files.lines 方法,所以我认为必须有一种对称的方法来写入文件,但找不到。 Files.write 只需要一个可迭代对象。

【问题讨论】:

我可以看到有一个方法Files#write(Path, Iterable<? extends CharSequence>, OpenOption ...)可以帮助你。 也许创建一个 FileOutputStream 然后创建一个 PrintStream @downvoter:需要解释一下吗? @LuiggiMendoza:是的,我也看到了,并且已经编辑了我的问题。那只需要一个可迭代的。是的,我可以转换,但我不想。 【参考方案1】:

可能最短的方法是使用Files.write 和trick 将Stream 转换为Iterable

Files.write(Paths.get(filePath), (Iterable<String>)stream::iterator);

例如:

Files.write(Paths.get("/tmp/numbers.txt"),
     (Iterable<String>)IntStream.range(0, 5000).mapToObj(String::valueOf)::iterator);

如果它看起来太老套,请使用更明确的方法:

try(PrintWriter pw = new PrintWriter(Files.newBufferedWriter(
                     Paths.get("/tmp/numbers.txt")))) 
    IntStream.range(0, 5000).mapToObj(String::valueOf).forEach(pw::println);

如果您有一些自定义对象的流,您可以随时添加.map(Object::toString) 步骤来应用toString() 方法。

【讨论】:

那么它到底是如何工作的呢? Iterator 如何转换为 Iterable @knub,它不是迭代器,它是对iterator() 方法的方法引用(我不调用iterator() 方法,而是创建方法引用)。方法引用是很正常的用法,可以转换成函数式接口类型。 稍微干净的Iterable source = stream::iterator; Files.write(路径,源); -- 没有演员表,更容易一目了然地了解它在做什么 为了澄清为什么在这里创建PrintWriter(而不仅仅是Writer):Writer 中的方法都抛出了一个检查过的IOException,这使得它们在@ 中使用起来很烦人987654339@。另一方面,PrintWriter.println 不会抛出异常。好把戏。

以上是关于Java 8流到文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用maven jetty插件在java 8上运行jetty 9时出现错误扫描文件[重复]

Java 8流手动短路[重复]

Java 8 toMap IllegalStateException 重复键

避免( java.nio.file.AccessDeniedException )的 Java 8 Files.walk(..) 终止原因 [重复]

JDK 8 - “无法解析类型 java.util.Map$Entry” [重复]

Java 8,流查找重复元素