与此问题相关 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;
}
任何人都有其他想法吗?
答案 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查看目录以进行更改并采取相应措施