7

私はapache utilを使用して、ファイルをディレクトリにコピーしていますfileutil.copyFile(src, dest)

コピーしているファイルは外部ベンダーによって 2 秒ごとに更新されますが、ロックしたくありません (アプリケーションが Windows で実行されているため、さまざまな問題が発生します)。ソースファイルがロックされずにファイルをコピーまたは読み取る最も安全な方法を誰かがアドバイスしてくれることを願っていますか?

敬具

4

3 に答える 3

2

コピー アクションの前にファイル全体を明示的にロックしていないため、デフォルトの 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'がスローされたときにケースを処理するために何かをします。

于 2013-03-26T18:29:34.667 に答える
1

これはHow to Cache a File in Javaからの抜粋です。詳細はそこにあります。

Java でのファイルのキャッシュ


特にアプリケーションが同じファイルを何度も読み取る場合は、ディスクからのファイルの読み取りが遅くなる可能性があります。キャッシュは、頻繁にアクセスされるファイルをメモリに保持することで、この問題を解決します。これにより、アプリケーションは、低速のハード ドライブではなく、高速のローカル メモリからコンテンツを読み取ることができます。Java でファイルをキャッシュするための設計には、次の 3 つの要素が含まれます。

  1. ファイルをキャッシュするためのアルゴリズム
  2. キャッシュされたコンテンツを保持するためのデータ構造
  3. キャッシュされたファイルを保存するためのキャッシュ API

ファイルをキャッシュするアルゴリズム


ファイルをキャッシュするための一般的なアルゴリズムは、ファイルの変更を考慮する必要があり、次の手順で構成されます。

  1. 完全修飾ファイル パスをキーとして使用して、キャッシュから値を取得します。
  2. キーが見つからない場合は、ファイルの内容を読み取ってキャッシュに入れます。
  3. キーが見つかった場合は、キャッシュされたコンテンツのタイムスタンプがファイルのタイムスタンプと一致するかどうかを確認します。
  4. タイムスタンプが等しい場合は、キャッシュされたコンテンツを返します。
  5. タイムスタンプが等しくない場合は、ファイルを読み取ってキャッシュに入れることにより、キャッシュを更新します。
于 2013-03-28T20:51:22.983 に答える
0

http://docs.oracle.com/javase/6/docs/api/java/io/RandomAccessFile.htmlをご覧ください。

多分これはあなたを助けるでしょう。

于 2013-03-15T11:27:06.553 に答える