ファイルのサブセットを別のファイルにコピーする必要があるJavaのシステムを構築しました(必ずしもファイルの先頭ではない)。私。 simultaneosulyので、私はスレッドするプロセスが必要あるファイルから別のファイルへの効率的なコピー
File srcFile, File dstFile, long srcFileOffset, long dstFileOffset, long length
複数のスレッドが同じソース・ファイルからの読み取りと、(異なるオフセットを持つが)同じ宛先ファイルに書き込むことができます:私は、次のパラメータを持っています安全です(つまり、スレッドが書き込み/読み取り中に他のスレッドがファイルを探してしまうのを防ぐ)。
これはどのように実装しますか? RandomAccessFileまたはJava NIOを使用する必要がありますか?どのようなロックを取得する必要がありますか?例えば。 RandomAccessFileインスタンスは自動的にファイルのシステム全体のロックを取得するのですか、それとも別に保持する必要がありますか?
編集:randomAccessFile.getChannel().tryLock()
はシステム全体のロックを取得しますが、VMによって保持されており、呼び出し元のスレッドではありません。だから私はそれを使用している場合、私はスレッドのロックを取得する必要が(または2つの実際に私は両方のソースと宛先ファイルをロックする必要があるため)。
興味深いことに、私はseekによって設定された位置がRandomAccessFileインスタンスのためにローカルであると思います。同じファイルへの書き込みアクセスでいくつかのインスタンスを開き、ディスクリプタ内の別々の位置を保持できることはわかりませんでした。 – Yrlec