Подтвердить что ты не робот

Как сохранить файл с помощью JFileChooser в Java?

У меня есть следующий код. Он сохраняет файл, но с пустым контентом. Что с ним не так?

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

Ответ 1

Если вы используете Java 7, попробуйте использовать ресурсы. Вот как вы это сделаете:

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() также может быть очень важным при общении, например, через Интернет, потому что вам нужно будет скрыться, пока другой конец не увидит ваше сообщение. Это не сделает их очень полезными, если ваше сообщение просто сидит в памяти.

Как только вы закончите с любым потоком ввода-вывода, вы должны вызвать close() (за исключением стандартных потоков ввода-вывода). Это означает, что ОС больше не нужно поддерживать этот поток. В некоторых случаях существует ограниченное количество потоков, которые можно открыть, например, с файлами, поэтому очень важно, чтобы вы не забыли закрыть.

Когда вы вызываете close, он фактически выполняет две функции: он освобождает буфер и затем закрывает поток. Это делается для того, чтобы до того, как поток закрылся, ничего не осталось.

Ответ 2

Не забудьте flush и close ваш FileWriter.

Ответ 3

Вам нужно close() ваш FileWriter.