- ベストアンサー
ファイルロック後の書き込み問題とその解決方法
- ファイルAをロックしファイルBを読み込み、ファイルAに書き込むプログラムを作成していますが、複数起動するとファイルの書き込みが行われなくなってしまいます。なぜ書き込みが行われなくなってしまうかご教授いただけますか?
- ロックしたプログラム以外はロックエラーになり、ロックについては正常に動いているように見えます。
- プログラムを修正して複数起動しても書き込みができるようにする方法を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#3です 2つ目のプログラムを起動し、FileOutputStreamのオブジェクトを 生成した時点で新規作成してしまっています(ファイルが空) その後でロックのチェックをしているので「ロック中」と判断されます。 したがって1番目のプログラム終了時には2番目のプログラムによって クリアされてしまい、書き込まれていないように見えるようです。 とりあえず原因はコレではないかと思います。 対策は...どうしましょう?(苦笑
その他の回答 (3)
- tekebon
- ベストアンサー率62% (36/58)
どのように複数実行しているのでしょうか? 私のところでは普通に動くようです(XP/J2SE5) sleep中に起動するのであればclose()まえなので当然ロック中です。 また、テキストエディタなどで出力ファイルを開いていると テキストエディタがロックしていることも考えられます。
補足
このPGMを一つ起動してsleep中にもうひとつ同じPGMを起動しています。 そうすると後で起動したものは想定通りロックエラーになりますが 最初に起動した方はロックして記述してsleepしてクローズしているように見えますが記述がされていませんでした。 ファイルを開いている等は行っていません。 因みに単体起動だと正常に記述されています。 因みに環境はXPの java version "1.6.0_03" Java(TM) SE Runtime Environment (build 1.6.0_03-b05) Java HotSpot(TM) Client VM (build 1.6.0_03-b05, mixed mode, sharing) です。
- pcbeginner
- ベストアンサー率46% (261/560)
↓が原因では? ---JavaDocより抜粋----------------------------------------------- ファイルロックオブジェクトは最初から有効であり、release メソッドの呼び出し、ロックの獲得に使用したチャネルのクローズ、Java 仮想マシンの終了などによって解放されるまで、その状態を保持します。ロックの有効性は、isValid メソッドを呼び出すことによって確認できます。 ---------------------------------------------------------------- >System.out.println("rock error!!"); ↑は恥ずかしいですよ。
お礼
返信ありがとうございます。 ロック違いですね、やっちまいました。 javadoc抜粋については ロックはrelease・クローズ・PGM終了まで保持されるということですよね それは解るのですが2つPGMが起動された場合 ファイル記述がされないのとどう関わってくるのでしょうか?
closeする前に、outChannel.release()でロックを解除していないからでしょう。
お礼
返信ありがとうございます。 closeのところを以下のようにしたのですがだめでした。(>_<;) outFileLock.release(); outChannel.close(); output.close(); fis.close(); 何かクローズの仕方が間違っているのでしょうか
お礼
なるほど納得しました。 クローズ云々ではなくこのロジック自体に問題有りですね・・・ ファイル存在チェックを入れるか他の関数を調べてみます。 回答ありがとうございました。