0

この質問に関連し て、削除されたファイルへのJava書き込みは 、私の場合のみ読み取りを行っています。そのコメントによると、はい、Windows は削除をブロックしますが、Unix は削除しません。UNIX では IOException はスローされません。

コードは貧乏人のtail -fもので、ディレクトリ内の各ログ ファイルを監視する Java スレッドがあります。私の現在の問題は、ファイルが削除された場合です。私はそれを処理していません。新しいスレッドか何かを中止して開始する必要があります。以下のコードはUnixで例外をスローしないため、それが問題であることに気づきませんでした

コード

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f)));
String line = null;

while (true) {
    try {
        line = br.readLine();
        // will return null if no lines added
    } catch (IOException e) {
        e.printStackTrace();
    }

    if (line == null) {
        // sleep if no new lines added to file
        Thread.sleep(1000);

    } else {
        // line is not null, process line
    }
}

明日寝る前にこのチェックを追加してみます、たぶん十分です

if (!f.exists()) {
    // file gone, aborting this thread
    return;
}

他のアイデアはありますか?

4

2 に答える 2

2

ファイルの終わりに到達すると、BufferedReader は、ファイルが削除されたかどうかにかかわらず、常に null を返す必要があります。それはあなたがチェックしなければならないものではありません。

BufferedReader が null を返さないのを止めるのは非常に難しいため、いくつかのコードを示してもらえますか?

このプログラム

public class Main {

    public static void main(String... args) throws IOException {
        PrintWriter pw = new PrintWriter("file.txt");
        for (int i = 0; i < 1000; i++)
            pw.println("Hello World");
        pw.close();

        BufferedReader br = new BufferedReader(new FileReader("file.txt"));
        br.readLine();
        if (!new File("file.txt").delete())
            throw new AssertionError("Could not delete file.");
        while (br.readLine() != null) ;
        br.close();
        System.out.println("The end of file was reached.");
    }
}

Windows プリントについて

AssertionError: Could not delete file.

Linux プリントについて

The end of file was reached.
于 2012-07-05T21:16:31.883 に答える
1

WatchService APIを使用してディレクトリを監視して変更を確認し、それに応じて行動することができます

于 2012-07-05T21:15:47.467 に答える