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

Mic*_*bor 19 java file-io swing 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Rya*_*mos 21

如果您使用的是Java 7,请使用try with resources.这是你怎么做的:

try(FileWriter fw = new FileWriter(chooser.getSelectedFile()+".txt")) {
    fw.write(sb.toString());
}
Run Code Online (Sandbox Code Playgroud)

尝试使用资源自动调用close()失败或成功.

如果您不使用Java 7,请不要忘记致电close().close()会自动打电话flush().

...
fw.close();
...
Run Code Online (Sandbox Code Playgroud)

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

如果要在缓冲区达到容量之前清空缓冲区,则需要通过调用告诉FileWriter flush().flush()在通信时调用也非常重要,例如通过互联网,因为在另一端可以看到您的消息之前,您需要刷新.如果您的消息只是在内存中,那么它们将无法使用它们.

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

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


SLa*_*aks 5

你需要close()你的FileWriter.


Dan*_* D. 5

别忘了flushclose你的FileWriter.

  • 请参阅javadocs:http://docs.oracle.com/javase/7/docs/api/java/io/Flushable.html (2认同)