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

Java 如何检测已从br.readline()循环中删除的文件,java,unix,io,bufferedreader,bufferedwriter,Java,Unix,Io,Bufferedreader,Bufferedwriter,关于这个问题 只有在我的情况下,我才在阅读。根据这条评论,是的,Windows阻止删除,而Unix则不会。在unix下,从不抛出任何IOException 代码是穷人的tail-f,其中我有一个java线程监视目录中的每个日志文件。我目前的问题是,如果文件被删除,我就不会处理它。我需要中止并启动一个新线程或其他东西。我甚至没有意识到这是一个问题,因为下面的代码在Unix下不会抛出异常 代码 BufferedReader br = new BufferedReader(new InputStrea

关于这个问题 只有在我的情况下,我才在阅读。根据这条评论,是的,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;
}

有人有其他想法吗?

您可以查看目录使用情况以进行更改并相应地采取行动

您可以查看目录使用情况以进行更改并相应地采取行动

当您到达文件结尾时,无论是否已删除,BufferedReader都应始终返回空值。这不是你应该检查的东西

你能给我们看一些代码吗?因为很难阻止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.");
    }
}
关于Linux打印

The end of file was reached.

当到达文件末尾时,无论是否已删除,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.");
    }
}
关于Linux打印

The end of file was reached.

有趣的新东西。新的1.7版本看起来很有趣。1.7版本的新增功能。一旦您读取了文件的结尾,就无法返回并重试。保持文件句柄打开的唯一方法是不读取文件的结尾。您可以通过在执行读取之前检查文件长度来完成此操作(这意味着您不能直接使用readLine),一旦您读取了文件的结尾,就不能返回并重试。保持文件句柄打开的唯一方法是不读取文件的结尾。您可以通过在执行读取之前检查文件长度来完成此操作(这意味着您不能直接使用readLine)