私はapache utilを使用して、ファイルをディレクトリにコピーしていますfileutil.copyFile(src, dest)
コピーしているファイルは外部ベンダーによって 2 秒ごとに更新されますが、ロックしたくありません (アプリケーションが Windows で実行されているため、さまざまな問題が発生します)。ソースファイルがロックされずにファイルをコピーまたは読み取る最も安全な方法を誰かがアドバイスしてくれることを願っていますか?
敬具
コピー アクションの前にファイル全体を明示的にロックしていないため、デフォルトの os ファイル ロック メカニズムが機能しています。
外部プロセスが 2 秒ごとにファイルに書き込みを行っているときにソース ファイルをコピーすると、Windows マシンで何が起こるかを確認するための簡単なテスト プログラムを実行しました。
ファイルに書き込むプロセスで問題が発生したことはありません。
public static void main(String[] args) {
File f = new File("..\\test.txt");
long startTime = System.currentTimeMillis();
long elapsedTime = 0;
while (elapsedTime < 1000 * 60) {
try {
FileUtils.writeStringToFile(f, System.currentTimeMillis()+" : Data Write\r\n", true);
Thread.sleep(2000);
} catch (IOException ex) {
Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
} catch (InterruptedException ex){
Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
}
elapsedTime = System.currentTimeMillis() - startTime;
}
}
ファイルをコピーするプロセスは、ソース ファイルの長さが変わる前にコピーを終了しない場合、例外をスローします。この例外は、ファイルのコピーされたバージョンが不完全であることを警告しているようです。ファイルからの読み取りと同時に書き込みが発生しないようにタイミングを同期すると、この例外はスローされませんでした。
public static void main(String[] args) {
File f = new File("..\\test.txt");
long startTime = System.currentTimeMillis();
long elapsedTime = 0;
while (elapsedTime < 1000 * 60) {
try {
FileUtils.copyFile(f, new File("..\\test\\test.txt"));
Thread.sleep(2000);
} catch (IOException ex) {
Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
} catch (InterruptedException ex){
Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
}
elapsedTime = System.currentTimeMillis() - startTime;
}
}
このテストに基づいて、書き込みプロセスに何が起こるかについて心配する必要はありません。java.io.IOException: Failed to copy full contents from '..\test.txt' to '..\test\test.txt'
がスローされたときにケースを処理するために何かをします。
これはHow to Cache a File in Javaからの抜粋です。詳細はそこにあります。
Java でのファイルのキャッシュ
特にアプリケーションが同じファイルを何度も読み取る場合は、ディスクからのファイルの読み取りが遅くなる可能性があります。キャッシュは、頻繁にアクセスされるファイルをメモリに保持することで、この問題を解決します。これにより、アプリケーションは、低速のハード ドライブではなく、高速のローカル メモリからコンテンツを読み取ることができます。Java でファイルをキャッシュするための設計には、次の 3 つの要素が含まれます。
ファイルをキャッシュするアルゴリズム
ファイルをキャッシュするための一般的なアルゴリズムは、ファイルの変更を考慮する必要があり、次の手順で構成されます。
http://docs.oracle.com/javase/6/docs/api/java/io/RandomAccessFile.htmlをご覧ください。
多分これはあなたを助けるでしょう。