• 締切済み

ファイルの排他について

はじめまして。 初心者ですが、今非常に困っております。 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("別のプロセス?が使用中") }  心当たりのある方がいらしゃいましたら、ご協力お願い致します。

みんなの回答

noname#16216
noname#16216
回答No.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/pattern/gof/singleton.html
  • UKY
  • ベストアンサー率50% (604/1207)
回答No.2

RandomAccessFile を使ってファイルを読み書きするだけでは、ファイルをロックしたことにはなりません。これは、FileInputStream や FileOutputStream などを使っても同じです。 Java のバージョン 1.4 では、ファイルの排他制御に関するクラスが提供されています。 RandomAccessFile#getChannel() で FileChannel オブジェクトを取得し、その lock() メソッドを使ってロックします。 バージョン 1.3 では、残念ながらファイルの排他制御はできません。

  • kou2000
  • ベストアンサー率29% (14/48)
回答No.1

JavaはOSやプラットフォームに依存しないように設計された言語ですが、ファイルの指定はOS固有の方法に依存します。また現時点でファイルに対する排他制御(ロック)の機能は提供されていません。