22

我有以下代码。它保存文件但内容为空。它出什么问题了?

public void saveMap() {
    String sb = "TEST CONTENT";
    JFileChooser chooser = new JFileChooser();
    chooser.setCurrentDirectory(new File("/home/me/Documents"));
    int retrival = chooser.showSaveDialog(null);
    if (retrival == JFileChooser.APPROVE_OPTION) {
        try {
            FileWriter fw = new FileWriter(chooser.getSelectedFile()+".txt");
            fw.write(sb.toString());
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
4

3 回答 3

24

如果您使用的是 Java 7,请对资源使用 try。你会这样做:

try(FileWriter fw = new FileWriter(chooser.getSelectedFile()+".txt")) {
    fw.write(sb.toString());
}

尝试使用资源close()会在失败或成功时自动调用。

如果您没有使用 Java 7,请不要忘记调用close(). close()会自动调用flush()

...
fw.close();
...

要了解为什么需要刷新,您需要了解 FileWriter 的工作原理。当您说fw.write("blah")时,它实际上将该字符串放入内存中的缓冲区中。填满缓冲区后,FileWriter 会将字符串写入硬盘。它具有这种行为,因为在大块中写入文件效率更高。

如果要在缓冲区达到容量之前清空缓冲区,则需要通过调用来告诉 FileWriter flush()。通话flush()在通信时也非常重要,例如通过互联网,因为您需要在另一端看到您的消息之前刷新。如果您的信息只是放在内存中,它不会对它们有多大用处。

完成任何 I/O 流后,您应该调用close()(标准 I/O 流除外)。这意味着操作系统不再需要维护这个流。在某些情况下,可以打开的流数量有限,例如文件,所以不要忘记关闭是非常重要的。

当您调用 close 时,它​​实际上做了两件事:清空缓冲区,然后关闭流。这是为了确保在流关闭之前不会留下任何东西。

于 2013-01-29T18:22:01.930 回答
6

不要忘记flushclose你的FileWriter.

于 2013-01-29T18:11:41.663 回答
5

你需要close()你的 FileWriter。

于 2013-01-29T18:11:25.840 回答