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 不返回空值?

这个节目

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.");
    }
}

在窗口打印

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 回答