如何检测文件已从br.readline()循环中删除

时间:2012-07-05 21:04:10

标签: java unix io bufferedreader bufferedwriter

与此问题相关 Java writing to a deleted file 只有在我的情况下,我正在阅读。根据该评论,是的,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;
}

任何人都有其他想法吗?

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:1)

您可以使用WatchService API查看目录以进行更改并采取相应措施