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

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();
        }
    }
}
3个回答

24

如果您正在使用Java 7,请使用try-with-resources。这是您应该这样做的方式:

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

使用try with resources 无论成功或失败都会自动调用close()方法。

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

...
fw.close();
...
为了理解为什么需要刷新,你需要了解FileWriter的工作原理。当你使用fw.write("blah")时,它实际上会将该字符串放入内存中的缓冲区中。一旦填满缓冲区,FileWriter就会把该字符串写入硬盘。这种行为是因为以大块方式写入文件更加高效。
如果你想在缓冲区达到容量之前清空缓冲区,你需要通过调用flush()告诉FileWriter。在通信(例如在互联网上)时,调用flush()也非常重要,因为在另一端能够看到你的消息之前,你需要先刷新。如果你的消息只停留在内存中,对他们来说没有什么用处。
一旦完成任何I/O流操作,你应该调用close() (标准I/O流除外)。这意味着操作系统不再需要维护此流。在某些情况下,如文件,可以打开有限数量的流,因此不要忘记关闭非常重要。
当你调用close时,它实际上执行两个操作:清空缓冲区,然后关闭流。这是为了确保在流关闭之前没有留下任何东西。

6

不要忘记flushclose你的FileWriter


1
CLOSING有所帮助,现在它可以工作了。但是FLUSH是什么意思? - Michał Tabor
2
请查看Javadocs文档:http://docs.oracle.com/javase/7/docs/api/java/io/Flushable.html - Dan D.

5
你需要关闭你的 FileWriter。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接