重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

ファイルAをロックしファイルBを読み込み
ファイルAに書き込むプログラムを作成しています。
単体起動では問題無く動くのですが
複数起動するとファイルの書き込みが行われなくなってしまいます。
ロックしたプログラム以外はロックエラーになり
ロックについては正常に動いているように見えます。
なぜ書き込みが行われなくなってしまうかご教授いただけますか?

import java.io.* ;
import java.nio.*;
import java.nio.channels.*;

public class CopyFile {
public static void main(String[] args) throws Exception {
try{
FileInputStream fis = null;
FileOutputStream output = null;
FileChannel outChannel = null;
FileLock outFileLock = null;

byte buf[] = new byte[2048];
int len;
int count = 0;

if (args.length != 2) {
System.out.println("使用法: java CopyFile ファイル名1 ファイル名2");
System.exit(0);
} //if
String source= args[0];
String target= args[1];
File sourceFile = new File(source);
File targetFile = new File(target);
fis = new FileInputStream(sourceFile);
output = new FileOutputStream(targetFile);
outChannel = output.getChannel();
outFileLock = outChannel.tryLock();

if (outFileLock == null) {
System.out.println("rock error!!");
System.exit(0);
} else {

while ((len = fis.read(buf)) != -1) {
output.write(buf, 0, len);
count += len;
}
Thread.sleep(5000);
output.flush();
output.close();
fis.close();
}
}catch(Exception e){
System.out.println(e);
}
}
} // Class CopyFile

A 回答 (4件)

#3です


2つ目のプログラムを起動し、FileOutputStreamのオブジェクトを
生成した時点で新規作成してしまっています(ファイルが空)
その後でロックのチェックをしているので「ロック中」と判断されます。
したがって1番目のプログラム終了時には2番目のプログラムによって
クリアされてしまい、書き込まれていないように見えるようです。
とりあえず原因はコレではないかと思います。
対策は...どうしましょう?(苦笑
    • good
    • 0
この回答へのお礼

なるほど納得しました。
クローズ云々ではなくこのロジック自体に問題有りですね・・・
ファイル存在チェックを入れるか他の関数を調べてみます。
回答ありがとうございました。

お礼日時:2007/12/04 18:13

どのように複数実行しているのでしょうか?


私のところでは普通に動くようです(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)
です。

補足日時:2007/12/04 15:37
    • good
    • 0

↓が原因では?


---JavaDocより抜粋-----------------------------------------------
ファイルロックオブジェクトは最初から有効であり、release メソッドの呼び出し、ロックの獲得に使用したチャネルのクローズ、Java 仮想マシンの終了などによって解放されるまで、その状態を保持します。ロックの有効性は、isValid メソッドを呼び出すことによって確認できます。
----------------------------------------------------------------

>System.out.println("rock error!!");
↑は恥ずかしいですよ。
    • good
    • 0
この回答へのお礼

返信ありがとうございます。
ロック違いですね、やっちまいました。

javadoc抜粋については
ロックはrelease・クローズ・PGM終了まで保持されるということですよね
それは解るのですが2つPGMが起動された場合
ファイル記述がされないのとどう関わってくるのでしょうか?

お礼日時:2007/12/04 14:46

closeする前に、outChannel.release()でロックを解除していないからでしょう。

    • good
    • 0
この回答へのお礼

返信ありがとうございます。
closeのところを以下のようにしたのですがだめでした。(>_<;)
outFileLock.release();
outChannel.close();
output.close();
fis.close();
何かクローズの仕方が間違っているのでしょうか

お礼日時:2007/12/04 14:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!