2012-07-05 66 views
0

與此問題相關 Java writing to a deleted file 只在我的情況下我正在讀取。並根據該評論,是的,Windows塊刪除和Unix不。並在unix下從來沒有拋出任何IOException如何檢測文件已從br.readline()循環內刪除

該代碼是一個窮人的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; 
} 

任何人有其他想法?

回答

1

你可以觀看使用WatchService API目錄更改並採取相應的行動

+0

有趣的新東西。新的1.7似乎 – 2012-07-06 02:36:39

2

當你達到一個文件的末尾,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."); 
    } 
} 

在窗口打印

AssertionError: Could not delete file. 

在Linux上打印

The end of file was reached. 
+0

謝謝,我不是很清楚,我已經添加了上面的代碼 – 2012-07-06 02:35:51

+0

一旦你讀完文件的結尾,你不能回去,再試一次。保持文件句柄打開的唯一方法是不讀取文件的結尾。您可以通過在執行讀取之前檢查文件長度來完成此操作(這意味着您不能直接使用readLine) – 2012-07-06 05:27:54

相關問題