- - PR -
一つのファイルに対する複数ストリームについて
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-04-08 17:08
一つのファイルに対して複数ストリームを開き
それぞれがファイルにログを書き込むというプラグラムを作成しました。 一応今のところ正常に動作しているのですが、 同時に書き込みが行われた場合もエラーが発生しないかどうか心配です。 もし同時書き込みが行われた場合にエラーは発生したりしないのでしょうか? 下にプログラムの該当メソッドをを記します。 public class Sample { public static void log(String str, Throwable e) { FileWriter fWriter = new FileWriter("c:\\tmp\\log.log"); PrintWriter pWriter = new PrintWriter(pWriter); fWriter.write(str); fWriter.flush(); e.printStackTrace(pWriter); pWriter.flush(); } } 環境 Solaris 5.7 JDK1.2.2 Tomcat3.1 | ||||||||
|
投稿日時: 2005-04-08 17:34
そういう期待をするよりも、同時書き込みを制限するコードを記述したほうが確実ですよね。。 ログ出力ロジックなら、 ・SampleクラスをSingletonにする。 ・logメソッドはsynchronizedにする。 といったところでしょうか。
ちょこっといじくらせていただきました。 [ メッセージ編集済み 編集者: Edosson 編集日時 2005-04-08 17:59 ] | ||||||||
|
投稿日時: 2005-04-10 19:15
WindowsXPでCPU2個(HT)でスレッド10個でやってみましたが正常に動作しました。
ただしFileWriterのJavaDocには * Some platforms, in particular, allow a file to be * opened for writing by only one <tt>FileWriter</tt> (or other file-writing * object) at a time. In such situations the constructors in this class * will fail if the file involved is already open. とあるのでOSやVM依存となると思います。おそらくOSかVMで直列にしてくれるのでしょうがおそらく書き込みが成功するまで待ち状態になることを考えるとJava側で書き込み処理をキューイングしてやらないとこのロギングが深刻なパフォーマンスの問題を発生させる可能性も考えられます。自力でそうしたコードを記述するのは大変なのでLog4jやJavaのloggingパッケージを利用することをお勧めします。 | ||||||||
|
投稿日時: 2005-04-10 20:47
同時書き込みが行われた場合にエラーになる可能性はないか?
ということに関してなら、心配は無用です。 ただし、プログラムが意図通りに動いてくれるかどうかは別問題です。 例えば、
のようなコードが複数スレッドから呼び出された場合に name=name=barfoo などと出力が混じってしまうのを防止したいのであれば、 Javaのレベルでも同期化の仕掛けを施しておく必要があります。 | ||||||||
|
投稿日時: 2005-04-11 11:17
結局Edossonさんの案を参考にして
Singletonとsyncronizedを使用することにしました。 ロギングフレームワークを使用することは、 アプリがエラーさえ起こらなければいいので 今回は見送ります。 みなさんどうもありがとうございました。 |
1