我做了一个简单的练习:
我想出了以下代码:
import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.StandardOpenOption;
import java.util.List;
import java.util.stream.Collectors;
import static java.nio.file.Files.lines;
import static java.nio.file.Files.newBufferedWriter;
import static java.nio.file.Files.write;
import static java.nio.file.Paths.get;
import static java.util.stream.Collectors.toList;
public class FileParser {
public static final String PATH = "test.txt";
public static void main(String... args) {
try {
List<String> strings = lines(get(PATH)).filter(line -> !line.startsWith("//")).map(line -> line.trim().replaceAll(" +", " ")).collect(toList());
// write(get(PATH), strings, StandardOpenOption.WRITE);
BufferedWriter writer = newBufferedWriter(get(PATH));
for (String string : strings) {
writer.write(string);
writer.newLine();
}
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
不幸的是,由于某种原因,评论的代码片段不起作用,而下面的代码则可以正常工作。该字符串列表也始终只包含正确的结果。对于文件:
a
//b
c
预期结果应为:
a
c
虽然实际结果是:
a
c
c
这个问题的根源是什么?
当写入我们从中读取的文件时,它可以正常工作。
答案 0 :(得分:1)
Here's StandardOpenOptions
的Javadoc。这就是关于WRITE
选项的说法:
打开以进行写访问。
虽然它没有太多信息,但它会打开文件并从头开始编写。它会覆盖现有内容并保留剩余文本。如果要删除现有内容,则需要使用TRUNCATE_EXISTING
选项:
如果该文件已存在并且已打开以进行WRITE访问,则其长度将被截断为0.如果仅为READ访问打开该文件,则忽略此选项。
在使用此选项之前,您需要确保文件未打开(在任何编辑器或程序中)。
以下是适用于您的文件的测试程序:
public static void main(String[] args) throws IOException {
List<String> strings = Files.lines(Paths.get("<somepath>/Test.txt")).filter(line -> !line.startsWith("//")).map(line -> line.trim().replaceAll(" +", " ")).collect(Collectors.toList());
System.out.println(strings);
Files.write(Paths.get("<somepath>/Test.txt"), strings, StandardOpenOption.TRUNCATE_EXISTING);
}