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()
方法,而是创建方法引用)。方法引用是很正常的用法,可以转换成函数式接口类型。
稍微干净的IterablePrintWriter
(而不仅仅是Writer
):Writer
中的方法都抛出了一个检查过的IOException
,这使得它们在@ 中使用起来很烦人987654339@。另一方面,PrintWriter.println
不会抛出异常。好把戏。以上是关于Java 8流到文件[重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用maven jetty插件在java 8上运行jetty 9时出现错误扫描文件[重复]
Java 8 toMap IllegalStateException 重复键
避免( java.nio.file.AccessDeniedException )的 Java 8 Files.walk(..) 终止原因 [重复]