Java8使用文件修改文件。线
我想读入一个文件,用新的文本替换一些文本。使用asm和int 21h会很简单,但我想使用新的Java8流
Files.write(outf.toPath(),
(Iterable<String>)Files.lines(inf)::iterator,
CREATE, WRITE, TRUNCATE_EXISTING);
在那里的某个地方我想要一个lines.replace("/*replace me*/","new Code()\n");
。新行是因为我想测试在某处插入代码块
这里有一个play示例,它不是按照我希望的方式工作,而是编译。我只需要截取迭代器中的行,并用代码块替换某些短语
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import static java.nio.file.StandardOpenOption.*;
import java.util.Arrays;
import java.util.stream.Stream;
public class FileStreamTest {
public static void main(String[] args) {
String[] ss = new String[]{"hi","pls","help","me"};
Stream<String> stream = Arrays.stream(ss);
try {
Files.write(Paths.get("tmp.txt"),
(Iterable<String>)stream::iterator,
CREATE, WRITE, TRUNCATE_EXISTING);
} catch (IOException ex) {}
//// I'd like to hook this next part into Files.write part./////
//reset stream
stream = Arrays.stream(ss);
Iterable<String> it = stream::iterator;
//I'd like to replace some text before writing to the file
for (String s : it){
System.out.println(s.replace("me", "my\nreal\nname"));
}
}
}
编辑:我已经走到了这一步,它是有效的。我试着用过滤器,也许这不是真的必要
Files.write(Paths.get("tmp.txt"),
(Iterable<String>)(stream.map((s) -> {
return s.replace("me", "my\nreal\nname");
}))::iterator,
CREATE, WRITE, TRUNCATE_EXISTING);
# 1 楼答案
这里的
Files.write(..., Iterable, ...)
方法似乎很吸引人,但将流转换为Iterable会让这变得很麻烦。它还从Iterable中“提取”,这有点奇怪。如果文件写入方法可以被用作流的终端操作,在类似forEach
的范围内,这将更有意义不幸的是,大多数写东西都会抛出
IOException
,这是forEach
所期望的Consumer
函数接口所不允许的。但PrintWriter则不同。至少,它的编写方法不会抛出检查过的异常,尽管打开一个方法仍然可以抛出IOException
。下面是它的使用方法注意
forEachOrdered
的使用,它以读取输出行的相同顺序打印输出行,这大概是您想要的如果从输入文件中读取行,修改行,然后将其写入输出文件,那么将两个文件放在同一个try with resources语句中是合理的: