try (Stream<String> lines = Files.lines(targetFile)) {
List<String> replacedContent = lines.map(line ->
StringUtils.replaceEach(line,keys, values))
.parallel()
.collect(Collectors.toList());
Files.write(targetFile, replacedContent);
}
我正在尝试替换文件每一行中的多个文本模式。但我观察到“\r\n”(相当于 10 和 13 的字节)被替换为“\r”(仅 10),我的比较测试失败了。
我想保留输入文件中的换行符并且不希望 java 接触它们。任何人都可以建议是否有一种方法可以做到这一点而不必使用单独的默认替换“\r\n”。
最佳答案
问题是 Files.lines()
是在 BufferedReader.readLine()
之上实现的,它读取一行直到行终止符并将其丢弃.然后,当您使用类似 Files.write()
的代码编写行时,这会在每行之后提供系统特定的行终止符,这可能与读入的行终止符不同。
如果您真的想保留行终止符的原样,即使它们是不同行终止符的混合,您也可以为此使用正则表达式和 Scanner
。
首先定义一个匹配包含有效行终止符或 EOF 的行的模式:
Pattern pat = Pattern.compile(".*\\R|.+\\z");
\\R
是一个特殊的换行匹配器,它匹配通常的行终止符和一些我从未听说过的 Unicode 行终止符。 :-) 如果您只需要通常的 CRLF、CR,则可以使用 (\\r\\n|\\r|\\n)
或 LF 终止符。
您必须包含 .+\\z
才能匹配文件中没有行终止符的潜在最后“行”。确保正则表达式始终匹配至少一个字符,以便当扫描程序到达文件末尾时找不到匹配项。
然后,使用 Scanner
读取行,直到它返回 null
:
try (Scanner in = new Scanner(Paths.get(INFILE), "UTF-8")) {
String line;
while ((line = in.findWithinHorizon(pat, 0)) != null) {
// Process the line, then write the output using something like
// FileWriter.write(String) that doesn't add another line terminator.
}
}
关于java - 如何在使用流读取文件时保留换行符 - java 8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35324062/