22

次のコードがあります。それはファイルを保存しますが、内容は空です。どうしたの?

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

3 に答える 3

24

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()インターネットなどで通信する場合も、相手がメッセージを見る前にフラッシュする必要があるため、電話をかけることは非常に重要です。あなたのメッセージがただ記憶に残っているだけなら、それはそれらをあまり使いません。

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

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

于 2013-01-29T18:22:01.930 に答える
6

とあなたのを忘れないflushcloseくださいFileWriter

于 2013-01-29T18:11:41.663 に答える
5

close()FileWriterが必要です。

于 2013-01-29T18:11:25.840 に答える