- PR -

ファイルサイズの監視

1
投稿者投稿内容
K
大ベテラン
会議室デビュー日: 2004/04/07
投稿数: 174
投稿日時: 2005-03-14 20:04
以下のようなことを実現したいと思っておりますがなにかよい知恵がありましたらご教示ください。

1:あるスレッドがローカルストレージ上のファイルに書き込みを続けています。
(ストリームはオープンしっぱなし)

2:別スレッドで書き込まれているファイルのサイズを監視し、一定サイズを超えたら
書き込みを停止したい。

上記2を実現するにはどのような方法がいいでしょうか?
ファイルサイズの変更を監視し、上限を超えたら1のスレッドに通知するような仕組みを
考えているのですが、監視するスレッドの動作でよいものが思いつきません。

監視する側のループの中で毎回ファイルの読み込みを行うのではI/Oが頻繁に発生してしまうので効率が悪いように思います。

ちなみに環境はJ2SE1.4.2です。
OSはWindows2000とLinux(RedHatLinux ES)の両方で同様のロジックで実現したいです
(つまりプラットフォーム依存のコードは避けたいです)。

どうぞよろしくお願いします。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-03-14 20:29
1.サイズ監視のためだけにマルチスレッドなんて、勿体無いので止め
2.書き込みを続けているスレッドで、FileOutputStreamではなくて
 RandomAccessFileを使用して書き込むように変更する。
3.書き込みを続けているスレッド自身で、RandomAccessFile#length()
でファイルサイズチェック。
じゃだめですか?
takamaro
大ベテラン
会議室デビュー日: 2004/10/12
投稿数: 100
投稿日時: 2005-03-14 20:37
java.io.File#length() を使われてみてはいかがでしょうか。
Log4Jの新しいいRollingFileAppenderでは、ファイルサイズの上限を
監視する為に上記の処理が使われていました。
mogeさんの狙いとLog4Jとの間に1つ違いが有るとすれば、Log4Jでは
書き込み用スレッド、それを監視するスレッドという分け方はしていな
いという点ですね。
ファイルへの書き出し前に、判定条件としてlength()の戻り値を使い、
サイズを越えていれば書き込みを停止、または新たなファイルを作成、
という手順にすれば別のスレッド(監視用)を持つ必要は無いのでは
ないかと思います(特別の理由があればまた別ですけど)

K
大ベテラン
会議室デビュー日: 2004/04/07
投稿数: 174
投稿日時: 2005-03-14 20:43
シュンさま、takamaroさま
ご返答ありがとうございました。

別のスレッドにしていたのはそのほうが設計的にきれいかなとか、再利用しやすいのかな
ぐらいの理由でした。
やりたいことはLog4jのRollingFileAppenderと同じようなことなので、java.io.File#length
を用いて単一スレッドで実現するほうほうで試してみたいと思います。
どうもありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)