java - 如何在使用流读取文件时保留换行符 - java 8

标签 java java-8 newline java-stream replaceall

      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 行终止符。 :-) 如果您只需要通常的 CRLFCR,则可以使用 (\\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/

相关文章:

java - spring-data-jpa 不适用于 java 8 LocalTime

php - 与 nl2br 类似的函数,但使用 <w :br/> tags and removing any break lines

javascript - 如何为 HTML 标记属性使用多行值? (即我如何转义换行符?)

java - 多个正则表达式模式来替换多次出现的图像标签

java - 奇怪的 Tomcat 尾部斜杠重定向域处理

java - 不应用对 View 的编程更改

windows - 使用 Powershell 的 UNIX 格式文件

java - 如何解决FindBugs DP_DO_INSIDE_DO_PRIVILEGED

jpa - 如何将 java.util.Date 转换为 Java8 java.time.YearMonth

java - 将 Runnable 转换为 Supplier