如何在Java中使用JFileChooser保存文件?

时间:2013-01-29 18:09:01

标签: java swing file-io jfilechooser

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

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();
        }
    }
}

3 个答案:

答案 0 :(得分:21)

如果您使用的是Java 7,请使用try with resources。这就是你要做的事情:

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会将字符串写入硬盘驱动器。它有这种行为,因为在大块中编写文件效率更高。

如果要在缓冲区达到容量之前清空缓冲区,则需要通过调用flush()告诉FileWriter。在通信时调用flush()也很重要,例如通过互联网,因为在另一端可以看到您的消息之前,您需要刷新。如果你的信息只是在内存中,那么它们就不会用得多。

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

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

答案 1 :(得分:5)

您需要close()您的FileWriter。

答案 2 :(得分:5)

别忘了flushclose FileWriter