- 締切済み
ファイルの排他について
はじめまして。 初心者ですが、今非常に困っております。 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("別のプロセス?が使用中") } 心当たりのある方がいらしゃいましたら、ご協力お願い致します。
- みんなの回答 (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; } }
- UKY
- ベストアンサー率50% (604/1207)
RandomAccessFile を使ってファイルを読み書きするだけでは、ファイルをロックしたことにはなりません。これは、FileInputStream や FileOutputStream などを使っても同じです。 Java のバージョン 1.4 では、ファイルの排他制御に関するクラスが提供されています。 RandomAccessFile#getChannel() で FileChannel オブジェクトを取得し、その lock() メソッドを使ってロックします。 バージョン 1.3 では、残念ながらファイルの排他制御はできません。
- kou2000
- ベストアンサー率29% (14/48)
JavaはOSやプラットフォームに依存しないように設計された言語ですが、ファイルの指定はOS固有の方法に依存します。また現時点でファイルに対する排他制御(ロック)の機能は提供されていません。