NIO-ファイルロック

2293 ワード

ファイルのロック
ファイルのロックが最初は迷うかもしれません.プログラムやユーザーが特定のファイルにアクセスすることを防止することを意味するようです.実際、ファイルロックは通常のJavaオブジェクトロックのようなものです.推奨ロックです.それらはいかなる形式のデータアクセスを阻止するのではなく、逆にロックの共有と取得によってシステムの異なる部分が互いに協調することを許可する.
ファイル全体またはファイルの一部をロックできます. を取得すると、他の人は同じファイルまたはファイルの一部のロックを取得できません. が得られると、他の人は同じファイルまたはファイルの一部の共有ロックを得ることができるが、排他ロックを得ることはできない.ファイルのロックは、必ずしもデータを保護する目的ではありません.例えば、ファイルを一時的にロックして、他のプログラムの干渉がなく、特定の書き込み操作が原子になることを保証することができる.ほとんどのオペレーティングシステムでは、ファイルシステムロックが提供されていますが、同じ方法ではありません.一部のインプリメンテーションでは共有ロックが提供され、他のインプリメンテーションでは排他ロックのみが提供されます.実際には、ほとんどの実装ではそうではないが、ファイルのロック部分にアクセスできない実装もある.
ファイルのロック
ファイルの一部のロックを取得するには、開いているFileChannelのlock()メソッドを呼び出します.排他ロックを取得するには、ファイルを書き込みで開く必要があります.
RandomAccessFile raf = new RandomAccessFile( "usefilelocks.txt", "rw" );
FileChannel fc = raf.getChannel();
FileLock lock = fc.lock( start, end, false );

ロックがある場合は、必要な機密操作を実行してからロックを解除できます.
lock.release();

ロックを解除した後、ロックを取得しようとする他のプログラムは、それを取得する機会があります.
ファイルのロックと移植性
ファイルロックは複雑な操作である可能性があり、特に異なるオペレーティングシステムが異なる方法でロックを実現していることを考慮する.次のガイドラインは、コードの移植性を可能な限り維持するのに役立ちます.
  • は排他ロックのみを使用します.
  • は、すべてのロックを推奨式(advisory)と見なしている.
  • public class NIOFileLockTest {
    
        private final int start = 10;
        private final int end = 20;
    
        @Test
        public void fileLockTest() {
    
            try {
                RandomAccessFile raf = new RandomAccessFile(
                        "/Users/dongsj/workspace/dsj/javaSpace/nettyDemo/src/test/resources/nio/readandshow.log",
                        "rw");
                FileChannel fc = raf.getChannel();
    
                System.out.println("   ");
                FileLock lock = fc.lock(start, end, false);
                System.out.println("     ");
    
                System.out.println("  3s");
                Thread.sleep(3000);
    
    
                System.out.println("   ");
                lock.release();
                System.out.println("     ");
    
                raf.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }