プロが教えるわが家の防犯対策術!

はじめまして。
初心者ですが、今非常に困っております。
RandomAccessFileを使用して、ファイルの排他をしたいのですが・・・。具体的に言うと、AがAAA.xmlをOPEN中にBがAAA.xmlをOPENしようとするとAがOPEN中なので、例外処理に飛ばしたいのです。いくら試みても例外処理に飛びません。

<例>(java version "1.3.1.05")
try
{
raf = new RandomAccessFile("AAA.xml","rw"); // OPEN
raf.writeBytes(111); // WRITE1
raf.writeBytes(222); // WRITE2
raf.writeBytes(333); // WRITE3
raf.writeBytes(444); // WRITE4
raf.writeBytes(555); // WRITE5
raf.close(); // CLOSE
}
catch(IOException e)
{
// 排他制御に失敗. リトライしたい
System.out.println("別のプロセス?が使用中")
}


 心当たりのある方がいらしゃいましたら、ご協力お願い致します。

A 回答 (3件)

JDK1.3 で排他制御を行うなら、参考URLにある「Singleton」パターン辺りを応用して、


こんな感じで自前で実装されてはいかがでしょうか?

なお、実際に動かしたわけではないですし、あくまで
簡単な例です。使うときには、もっと考えてください。。。

public FileLock {
 private static RandomAccessFile raf = null;

 synchronized static public RandomAccessFile open(String file, String mode)
 throws IOException {
  if( raf == null ) {
   raf = new RandomAccessFile(file, mode);
   return raf;
  }
  else {
   throw new IOException("別プロセスが利用中");
  }
}

synchorized public static void close() {
  raf.close();
  raf = null;
 }
}

参考URL:http://www.dmz.hitachi-sk.co.jp/Java/Tech/patter …
    • good
    • 0

RandomAccessFile を使ってファイルを読み書きするだけでは、ファイルをロックしたことにはなりません。

これは、FileInputStream や FileOutputStream などを使っても同じです。

Java のバージョン 1.4 では、ファイルの排他制御に関するクラスが提供されています。

RandomAccessFile#getChannel() で FileChannel オブジェクトを取得し、その lock() メソッドを使ってロックします。

バージョン 1.3 では、残念ながらファイルの排他制御はできません。
    • good
    • 0

JavaはOSやプラットフォームに依存しないように設計された言語ですが、ファイルの指定はOS固有の方法に依存します。

また現時点でファイルに対する排他制御(ロック)の機能は提供されていません。
    • good
    • 0

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