2017-03-21 9 views
1

私は、バッファ付きのWriterとFileWriterを使ってJavaプログラム(csv形式)のロガーを作成しています。プログラムが実行され、ファイルへの書き込みを続けている間、私は、CSVファイルを開くとファイルをJavaで書き込む - 閉じるまたはフラッシュする

、私はこの例外が発生しました:「それは別のプロセスによって使用されているため、プロセスはファイルにアクセスできません」。私が欲しいもの

は、プログラムが実行されている間、私は、CSVファイルを開くと、csvファイルを読み込みモードで開きますされ、プログラムがファイルに正常に書き込みます。

Iは.flush()にBufferedWriterの及びてFileWriterの閉鎖を変更することによってそれを解決代わり.close()(元のクローズ機能付き)

オリジナル最小ロガーコード

public class logger { 
    private BufferedWriter bw = null; 
    private FileWriter fw = null; 
    private File file = null; 

    logger(String nclass) { 

     path = "c:\\test\\test.csv"; 
     this.file = new File(path); 

     // Check if the file is already exist. 
     if (!file.exists()) { 
      file.createNewFile(); 
     } 

     fw = new FileWriter(file.getAbsoluteFile(), true); 
     bw = new BufferedWriter(fw); 
    } 
    public void writeToFile(String msg) { 
    entryWrite(); 

    try { 

     fw = new FileWriter(file.getAbsoluteFile(), true); 
     bw = new BufferedWriter(fw); 
     fw.append(msg); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     close(); 
     exitWrite(); 
    } 
} 

}

private void close() { 
try { 
    if (bw != null) { 
     bw.close(); 
     bw = null; 
    } 
    if (fw != null) { 
     fw.close(); 
     fw = null; 
    } 
} catch (IOException ex) { 
    ex.printStackTrace(); 
} 

}

私のソリューション機能

private void close() { 
try { 
    if (bw != null) { 
     bw.flush(); 
     bw = null; 
    } 
    if (fw != null) { 
     fw.flush(); 
     fw = null; 
    } 
} catch (IOException ex) { 
    ex.printStackTrace(); 
} 

}

今、私の答えは、それがOKであれば、ストリームを閉じて、ちょうどフラッシュを使用しないのですか? 後で問題が生じることはありますか?なぜなら、私のすべてのテストでは、うまく動作するからです。

感謝!!

+1

完全な[mcve]を表示してください。重要な面がたくさんあります。そしてまずは。私はFileWriterを使ってBufferedWriterを作成していると思います。なぜ地球上で両方のメソッドを呼び出すのですか(外側のライターをフラッシュ/閉じる必要があります) – GhostCat

+0

@GhostCat - 追加されました。 – Idon89

+0

DUPとして閉じて、http://stackoverflow.com/questions/16584777/is-it-necessary-to-close-a-filewriter-provided-it-is-written-through-a-buffered ...にする必要があります。このコードは実際には...申し訳ありませんが、悪いです。 – GhostCat

答えて

1

これは非常に謙虚な方法で、いくつかの正直ですか?申し訳ありませんが、臭いコード:

  1. なぜグローバル?nullに「体重」と「FW」を設定する?なぜ?
  2. "ex.printStackTrace();" ?本当に?、ないlog4jまたは同様に?
  3. なぜfinallyブロックを使用しないのですか?ファイルの書き込み中に例外が発生した場合はどうなりますか?
  4. 誰かがすでにコードのために、このに答えたこの優れた答えを参照してください:

Is it necessary to close a FileWriter, provided it is written through a BufferedWriter?

+0

メインポストにほとんどのコードを追加しました。 \t 1.私は知らない、その問題? \t 2.プログラムのすべてのエラーを自分のロガーに書き込むので、log4jは必要ありません。私はロガーとプロブラムを持っていたとき、私はそれがjavaに住んでいるのを見る。 \t 3.私は最終的に私がファイルに書き込むのを終了したブロックを使用しました。私の更新されたコードを見てください。 \t 4.ありがとうございます。だから、代わりにフラッシュを使うのが安全だと思いますか? – Idon89

0

だけbufferedWriterオブジェクトのクローズを行います。

bw.close();

は、あなたが大きなfile.txtを持っている、と言います。 今度は、ファイルから何かを取り出し、毎回新しい小さなテキストファイルを作成します。その場合は 何らかの理由で特定のファイルへの書き込みが終了したかどうかを判断するコード行を書く必要があります。次に、フラグを使用してbw.close()を記述します。

最終的には、2番目のファイルを初期化してタスクを実行する必要があります。次にbw。閉じる();

fw.close()を記述しない場合、ファイルは空になります。 だから、それぞれのファイル書き込み操作にbw.close()を書く必要があることを確認してください。

関連する問題