web-dev-qa-db-ja.com

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

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の動作を理解する必要があります。 fw.write("blah")と言うと、実際にその文字列をメモリ内のバッファに入れます。バッファがいっぱいになると、FileWriterは文字列をハードドライブに書き込みます。ファイルの書き込みは大きなチャンクではるかに効率的であるため、この動作があります。

バッファが容量に達する前にバッファを空にしたい場合は、flush()を呼び出してFileWriterにこれを伝える必要があります。 flush()を呼び出すことは、インターネットなどで通信する場合にも非常に重要です。なぜなら、相手がメッセージを見る前にフラッシュする必要があるからです。あなたのメッセージがただメモリに座っている場合、それらはあまり使いません。

I/Oストリームの処理が完了したら、close()を呼び出す必要があります(標準のI/Oストリームを除く)。これは、OSがこのストリームを維持する必要がなくなったことを意味します。場合によっては、ファイルなどで開くことができるストリームの数が限られているため、閉じることを忘れないことが非常に重要です。

Closeを呼び出すと、実際には2つのことを行います。バッファを空にしてから、ストリームを閉じます。これは、ストリームが閉じる前に何も残らないようにするためです。

21
Ryan Amos

FileWriterをclose()する必要があります。

5
SLaks

flushcloseを忘れないでくださいFileWriter

5
Dan D.