
ファイル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
No.4ベストアンサー
- 回答日時:
#3です
2つ目のプログラムを起動し、FileOutputStreamのオブジェクトを
生成した時点で新規作成してしまっています(ファイルが空)
その後でロックのチェックをしているので「ロック中」と判断されます。
したがって1番目のプログラム終了時には2番目のプログラムによって
クリアされてしまい、書き込まれていないように見えるようです。
とりあえず原因はコレではないかと思います。
対策は...どうしましょう?(苦笑
なるほど納得しました。
クローズ云々ではなくこのロジック自体に問題有りですね・・・
ファイル存在チェックを入れるか他の関数を調べてみます。
回答ありがとうございました。
No.3
- 回答日時:
どのように複数実行しているのでしょうか?
私のところでは普通に動くようです(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)
です。
No.2
- 回答日時:
↓が原因では?
---JavaDocより抜粋-----------------------------------------------
ファイルロックオブジェクトは最初から有効であり、release メソッドの呼び出し、ロックの獲得に使用したチャネルのクローズ、Java 仮想マシンの終了などによって解放されるまで、その状態を保持します。ロックの有効性は、isValid メソッドを呼び出すことによって確認できます。
----------------------------------------------------------------
>System.out.println("rock error!!");
↑は恥ずかしいですよ。
返信ありがとうございます。
ロック違いですね、やっちまいました。
javadoc抜粋については
ロックはrelease・クローズ・PGM終了まで保持されるということですよね
それは解るのですが2つPGMが起動された場合
ファイル記述がされないのとどう関わってくるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Java int sum = 0は必要ですか?
-
Javaでデータに登録する度にID...
-
Javaの質問です。テキストファ...
-
九九を横に表示する。
-
Javaの質問です。テキストファ...
-
yyyymmddからyyyy/mm/d...
-
以下のJAVAプログラムでご質問...
-
BufferedReaderでのエラー
-
ファイル読込みにおける改行表...
-
printfを使って出力
-
equalsの逆
-
C言語のポインターに関する警告
-
System.err. printlnとSystem.o...
-
ループ処理の際、最後だけ","を...
-
動的配列が存在(要素が有る)か...
-
VBAで配列の計算
-
ORA-01858: 数値を指定する箇所...
-
java キーボード入力された値の...
-
toString()メソッドについて
-
flush()とclose()について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
yyyymmddからyyyy/mm/d...
-
テキストファイルから空白行をよむ
-
InputStream.read()でタイムア...
-
九九を横に表示する。
-
equalsの逆
-
Java int sum = 0は必要ですか?
-
csv出力について
-
BufferedReaderでのエラー
-
テキストファイルにおいて任意...
-
FileクラスのcanRead/canWrite...
-
[JAVA]エラーが解決できません。
-
Javaの質問です。テキストファ...
-
テキストファイルの任意の文字...
-
JAVAで、SSL通信
-
Class.forNameでエラーになる
-
javaのファイル読み込み時の文...
-
JAVAでエラーがでる。
-
Web上に表示されたデータをcsv...
-
java連結
-
linuxでapache poiが動かない。
おすすめ情報