如何在Java中使用JFileChooser保存文件?[已关闭]

2022-09-02 01:13:35

我有以下代码。它保存文件,但内容为空。这是怎么回事?

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

答案 1

如果您使用的是 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 的工作原理。当你说时,它实际上将该字符串放入内存中的缓冲区中。填充缓冲区后,FileWriter 会将字符串写入硬盘驱动器。它具有此行为,因为在大块中写入文件的效率要高得多。fw.write("blah")

如果要在缓冲区达到容量之前清空缓冲区,则需要通过调用 来告诉 FileWriter 这一点。在通信时(例如通过 Internet)呼叫也非常重要,因为您需要刷新,然后另一端才能看到您的消息。如果你的消息只是坐在内存中,它不会对他们有多大用处。flush()flush()

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

当您调用 close 时,它实际上会执行两项操作:清空缓冲区,然后关闭流。这是为了确保在溪流关闭之前没有留下任何东西。


答案 2

不要忘记和你的.flushcloseFileWriter