Files.write()无法正常工作,而BufferedWriter似乎没问题

时间:2017-01-25 23:26:12

标签: java file file-io

我做了一个简单的练习:

  • 读取文件
  • 过滤掉以“//”
  • 开头的所有行
  • 删除其他空格
  • 将其写回文件

我想出了以下代码:

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

这个问题的根源是什么?

当写入我们从中读取的文件时,它可以正常工作。

1 个答案:

答案 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);
}