Java 8 使用Files.lines修改文件

Java 8 使用Files.lines修改文件,java-8,java-stream,Java 8,Java Stream,我想读入一个文件并用新文本替换一些文本。使用asm和INT21H会很简单,但我想使用新的Java8流 Files.write(outf.toPath(), (Iterable<String>)Files.lines(inf)::iterator, CREATE, WRITE, TRUNCATE_EXISTING); 编辑:我已经走到了这一步,它是有效的。我试着用过滤器,也许这不是真的必要 Files.write(Paths.

我想读入一个文件并用新文本替换一些文本。使用asm和INT21H会很简单,但我想使用新的Java8流

    Files.write(outf.toPath(), 
        (Iterable<String>)Files.lines(inf)::iterator,
        CREATE, WRITE, TRUNCATE_EXISTING);
编辑:我已经走到了这一步,它是有效的。我试着用过滤器,也许这不是真的必要

        Files.write(Paths.get("tmp.txt"),
                 (Iterable<String>)(stream.map((s) -> {
                    return s.replace("me", "my\nreal\nname");
                }))::iterator,
                CREATE, WRITE, TRUNCATE_EXISTING);
Files.write(path.get(“tmp.txt”),
(Iterable)(stream.map(s)->{
返回s.replace(“我”、“我的真实姓名”);
}))::迭代器,
创建、写入、截断(现有);
这里的
Files.write(…,Iterable,…)
方法似乎很诱人,但是将流转换为Iterable会让这项工作变得很麻烦。它还从Iterable中“提取”,这有点奇怪。如果文件写入方法可以用作流的终端操作,在类似于
forEach
的范围内,这将更有意义

不幸的是,大多数编写操作都会抛出
IOException
,这是
forEach
所期望的
使用者
功能接口所不允许的。但PrintWriter则不同。至少,它的编写方法不会抛出选中的异常,尽管打开一个方法仍然可以抛出
IOException
。下面是它的使用方法

Stream<String> stream = ... ;
try (PrintWriter pw = new PrintWriter("output.txt", "UTF-8")) {
    stream.map(s -> s.replaceAll("foo", "bar"))
          .forEachOrdered(pw::println);
}

我很困惑。您想从文件中读取一些文本行,用其他文本(可能通过regex)替换这些行,然后将这些行写回文件?是吗?没错。也许我会在问题中解释得更好。谢谢,这比我的要干净得多,是的,我正在读一个输入文件。
Stream<String> stream = ... ;
try (PrintWriter pw = new PrintWriter("output.txt", "UTF-8")) {
    stream.map(s -> s.replaceAll("foo", "bar"))
          .forEachOrdered(pw::println);
}
try (Stream<String> input = Files.lines(Paths.get("input.txt"));
     PrintWriter output = new PrintWriter("output.txt", "UTF-8"))
{
    input.map(s -> s.replaceAll("foo", "bar"))
         .forEachOrdered(output::println);
}