たいのですがロックファイルをコロジカルフットプリント可能な場合)

StackOverflow https://stackoverflow.com/questions/128038

  •  02-07-2019
  •  | 
  •  

質問

いるJavaプロセスが開いたファイルを使用FileReader.ってしまいま別の(Java)の工程からこのファイルを開くには、少なくとも通知するこのファイルは既にオープン?このこと自動的に作りの工程を取得する場合の例外でのファイルのオープン(開放を解決する私の問題はいけないのは明示的に開いて最初のプロセスは何らかのフラグまたは引数?

の解明:

いるJavaアプリリストフォルダを開けるまでそれぞれのファイルの一覧を処理します。処理することでそれぞれのファイルいで行われるようになりました。の処理をそれぞれのファイルから読むのでやっ計算に準拠した内容を基本としており、約2分です。また別のJavaアプリでも同じことが行われていくの書き込みのファイルです。だいたいは走行できるようにこれらのアプリを同時にそのシナリオをこのように書きます。ReadAppリストフォルダを検出するとファイルA、B、Cでファイルを開始します。WriteAppリストフォルダを検出するとファイルA、B、Cでファイルを開き、見ているが(例外あway)およびファイルBReadApp終了ファイルA、Bで見ることがあるので、続けてCにあたることがきわめて重要でWriteAppな書きながらReadAppは読書と同じファイルを開きます。その異なるプロセス。

役に立ちましたか?

解決

FileChannel.ロックであろうと考えている。

FileInputStream in = new FileInputStream(file);
try {
    java.nio.channels.FileLock lock = in.getChannel().lock();
    try {
        Reader reader = new InputStreamReader(in, charset);
        ...
    } finally {
        lock.release();
    }
} finally {
    in.close();
}

(免責事項:コードは作成、確実な試験を実施する。)

注意のオペレーションプラットフォーム依存関係"に API docのためのFileLock.

他のヒント

なクラスを使用し、java.io パッケージには、代わりに使用し java.nio パッケージです。一方で、後者では FileLock クラスです。応募できるロックへ FileChannel.

 try {
        // Get a file channel for the file
        File file = new File("filename");
        FileChannel channel = new RandomAccessFile(file, "rw").getChannel();

        // Use the file channel to create a lock on the file.
        // This method blocks until it can retrieve the lock.
        FileLock lock = channel.lock();

        /*
           use channel.lock OR channel.tryLock();
        */

        // Try acquiring the lock without blocking. This method returns
        // null or throws an exception if the file is already locked.
        try {
            lock = channel.tryLock();
        } catch (OverlappingFileLockException e) {
            // File is already locked in this thread or virtual machine
        }

        // Release the lock - if it is not null!
        if( lock != null ) {
            lock.release();
        }

        // Close the file
        channel.close();
    } catch (Exception e) {
    }

使いいただけるのであれば Java NIO (JDK1.4以しいと思いま java.nio.channels.FileChannel.lock()

FileChannel.lock()

を求めることはできないため、利益のために来たので問題を別の角度から....

これら二つのJavaプロセスがアクセスしたい、同じファイルに同じアプリケーション?もしかすだけですべてのフィルターへのアクセスファイルを通じて、同期方法は、もっと良いのに使用 JSR-166)?そしでアクセスを制御することができるファイル、そしておそらくキューにアクセスします。

使用RandomAccessFile、このチャンネルを呼び出して、ロック().チャンネルによる入力または出力ストリームなのに十分な権限でロックします。必ず電話のロック解除()の最後にブロックの終値ファイルになることでロックを解除できます).

見つけるとともに、同誌掲載号の注目も年前に私が書いた他のアプリケーションに対する必要な複数のユーザー MacOS/Windows共に同じデータを複数のファイルです。ファイルのロックな作業MacOSで作成した自分の'ioFile'クラスを維持で登録ファイルのアクセスオープンr/o、r/wなど、人に所有される"とい'のロックが解除されます。このような時間っからのアクセス制御の異なるユーザーの異なる機械を使用のOSが異なる。

以下はサンプルのスニペットコードのロックファイルまでの過程でJVMを装備しています。

 public static void main(String[] args) throws InterruptedException {
    File file = new File(FILE_FULL_PATH_NAME);
    RandomAccessFile in = null;
    try {
        in = new RandomAccessFile(file, "rw");
        FileLock lock = in.getChannel().lock();
        try {

            while (in.read() != -1) {
                System.out.println(in.readLine());
            }
        } finally {
            lock.release();
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        try {
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

ばファイルにアクセスの同期化ブロック、インスタンスのスレッドが入力でき、そのままでは仕上げました。

public class FileReader{
  public void read() {
    synchronized (this) {
      //put you file access here
    }
  }
}
package tips.javabeat.nio.lock;  

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

public class FileLockTest {  

    public static void main(String[] args) throws Exception {  

       RandomAccessFile file = null;  

         FileLock fileLock = null;  

         try 

         {  

             file = new RandomAccessFile("FileToBeLocked", "rw");  

             FileChannel fileChannel = file.getChannel();  



             fileLock = fileChannel.tryLock();  

             if (fileLock != null){  

                 System.out.println("File is locked");  

                 accessTheLockedFile();  

             }  

         }finally{  

             if (fileLock != null){  

                 fileLock.release();  

             }  

         }  

     }  



     static void accessTheLockedFile(){  

        try{  

         FileInputStream input = new FileInputStream("FileToBeLocked");  

          int data = input.read();  

            System.out.println(data);  

      }catch (Exception exception){  

             exception.printStackTrace();  
        }  

     }  

使用java.nio.* Apiのためのロック、ファイルです。しかしことを保証するものではありませんロックによって違いますので、それぞれる場合にチェックを入れ、配下のOSをロックす。 として理解している営業システムのLinux doensな支援ロックとはできませんロックを使用している場合でもこれらのApi

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top