2

別のプロセスによって変更される可能性のあるファイルを Java で読み込もうとするとどうなるのだろうと思っています。たとえば、次の擬似コードが与えられます。

File f = new File("a");

if (f.exists()) {
    // A
    BufferedReader br = new BufferedReader(new FileReader(f));
    // B
    String line = "";

    while ((line = br.readLine() ) != null ) {
        // C
        out.println(line);
    }
}

これらのコメントされた場所 (A/B/C) でファイル名が別のプロセスによって変更されていたらどうなるでしょうか? 代わりに、ファイルが削除されたか、別のファイルに置き換えられた場合、違いはありますか? 異なる種類のファイル読み取りが実装されている場合、そのいずれかが影響を受けますか?

4

2 に答える 2

3

さまざまなプロセスがファイルにアクセスしている場合、 if(f.exists()) ロジックはあまり役に立ちません。実行が終了するまでに結果が異なる可能性がありますが、次の行が終了する前です。

ファイルのファイル名がポイント //A で変更された場合、 FileReader のドキュメントに従って FileNotFoundException が発生します。ファイルが別のリーダーに置き換えられても、気付かないはずです。

この時点で、VM がファイルを制御できるようになり、ほとんどの OS は他のプロセスがファイルにアクセスするのを防ぎます。

ただし、ファイルの同時変更は悪い考えであり、避ける必要があります。2 つのプロセスを通信させる方法を探している場合、一般的なオプションは、メモリ マップト ファイルを使用することです。繰り返しますが、別の解決策はおそらくはるかに健全です。

于 2012-06-18T14:36:32.907 に答える
3

exists()テストを削除してキャッチすることでポイントAを削除できますし、削除するFileNotFoundException,必要があります。ファイルを開いたら、それが何と呼ばれるかは関係ありません。一部のオペレーティングシステムでは、開いているファイルの名前を変更することはできません。また、'line' 変数を初期化する理由はありません。

于 2012-06-18T14:38:33.760 に答える