テキスト書き込み後のClose処理について

こんにちはTamamoです。

テキストファイルをストレージに書き込んだ後はFile関連の命令はcloseするのが基本だと思います。
しかし、ネットの情報を見ているとcloseされていないコードが散見されます。
恐らくですが、いつかはGCされるからとか、サンプルコードだから良いか、
という考えで書かれていないのかもしれません。

しかし、私は書き込んだ後は必ずFile関連はcloseするようにしています。
ただ、closeを記述する場所を間違えると以下のような現象が時々ですが発生しました。

public void fileWrite(String str) {

    String filePath = Environment.getExternalStorageDirectory() + “/” + “sample.txt”
    File file = new File(filePath);

    try{
            //出力ストリームの生成(追記モード)
            FileOutputStream fileOutputStream = new FileOutputStream(file, true);

            //出力ストリームのバッファリング
            BufferedWriter bw = new BufferedWriter(outputStreamWriter);

            //テキストデータをバッファに格納
            bw.write(str);

            //バッファのデータをファイルに書き込む
            bw.flush();

            //close処理
            fileOutputStream.close();
            outputStreamWriter.close();
            bw.close();
     } catch (Exception e) {
            e.printStackTrace();
     }
}

 

sample.txt(出力されたテキストファイル)
1,あいうえお
2,かきくけこ
3,さしすせそ
3,さしすせそ
4,たちつてと

1秒ごとにテキストファイルに追記するプログラムだったのですが、
この例では3が重複して出力されてしまいました。ただ、重複しない時もあります。
恐らくですが、書き込み処理(close含む)が間に合わずに何らかの原因で
バッファにたまった情報が連続で書き込まれてしまったのではないかと考えられます。

そこで、①のようにclose処理をfinallyに書くようにします。

public void fileWrite(String str) {

    String filePath = Environment.getExternalStorageDirectory() + “/” + “sample.txt”
    File file = new File(filePath);

    try{
            //出力ストリームの生成(追記モード)
            FileOutputStream fileOutputStream = new FileOutputStream(file, true);

            //出力ストリームのバッファリング
            BufferedWriter bw = new BufferedWriter(outputStreamWriter);

            //テキストデータをバッファに格納
            bw.write(str);

            //バッファのデータをファイルに書き込む
            bw.flush();
     } catch (Exception e) {
            e.printStackTrace();
     }finally {//①

            fileOutputStream.close();
            outputStreamWriter.close();
            bw.close();
    }
}

すると、重複するような現象は一切発生しなくなりました。

sample.txt(出力されたテキストファイル)
1,あいうえお
2,かきくけこ
3,さしすせそ
4,たちつてと

finallyは例外が発生するしないに関わらず必ず実行するので、
closeが適切に処理ができるようになったのかもしれません。
finallyの大切さを感じました。
これは今後のノウハウとして役に立ちそうです。

火曜日担当:Tamamo




アプリ関連ニュース

お問い合わせはこちら

お問い合わせ・ご相談はお電話、またはお問い合わせフォームよりお受け付けいたしております。

tel. 06-6454-8833(平日 10:00~17:00)

お問い合わせフォーム