web-dev-qa-db-fra.com

Comment enregistrer un fichier en utilisant JFileChooser en Java?

J'ai le code suivant. Il enregistre le fichier mais avec un contenu vide. Qu'est ce qui ne va pas avec ça?

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();
        }
    }
}
19
Michał Tabor

Si vous utilisez Java 7, utilisez try with resources. Voici comment procéder:

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

Essayer avec des ressources appelle automatiquement close() en cas d'échec ou de réussite.

Si vous n'utilisez pas Java 7, n'oubliez pas d'appeler close(). close() appellera automatiquement flush().

...
fw.close();
...

Pour comprendre pourquoi vous devez vider, vous devez comprendre le fonctionnement d'un FileWriter. Lorsque vous dites fw.write("blah"), il place cette chaîne dans un tampon en mémoire. Une fois que vous avez rempli le tampon, le FileWriter écrit ensuite la chaîne sur le disque dur. Il a ce comportement car l'écriture de fichiers est beaucoup plus efficace en gros morceaux.

Si vous voulez vider le tampon avant que le tampon n'atteigne sa capacité, vous devrez le dire au FileWriter en appelant flush(). L'appel de flush() peut également être très important lors de la communication, par exemple sur Internet, car vous devrez vider avant que l'autre extrémité ne puisse voir votre message. Cela ne leur sera pas très utile si votre message est simplement en mémoire.

Une fois que vous avez terminé avec n'importe quel flux d'E/S, vous devez appeler close() (à l'exception des flux d'E/S standard). Cela signifie que le système d'exploitation n'a plus à gérer ce flux. Dans certains cas, il existe un nombre limité de flux pouvant être ouverts, comme avec des fichiers, il est donc extrêmement important de ne pas oublier de fermer.

Lorsque vous appelez close, cela fait en fait deux choses: il vide le tampon puis ferme le flux. Il s'agit de s'assurer que rien n'est oublié avant la fermeture du flux.

21
Ryan Amos

Vous devez close() votre FileWriter.

5
SLaks

N'oubliez pas de flush et close votre FileWriter.

5
Dan D.