2017-06-22 104 views
0

我正在使用某種tail -f實現來修改文件的尾部(非常像this)。爲此,我使用RandomAccessFile,定期檢查文件長度是否增加,如果是,則查找並讀取新行(在FileTailer的單獨線程中發生的所有事情)。RandomAccessFile.seek()在Linux上不工作

現在,在Windows上一切都按預期工作,但是我在Linux上測試了我的程序,但它不能按預期工作。這是FileTailer類的run()方法。具體來說,在Linux上失敗的部分是file.seek(filePointer)被調用的部分,然後是file.readLine(),後者令人驚訝地返回NULL(儘管如果我將內容添加到文件尾部時,filePointer會正確遞增運行)。

public void run() { 
// The file pointer keeps track of where we are in the file 
long filePointer = 0; 

// Determine start point 
if(startAtBeginning){ 
    filePointer = 0; 
} 
else { 
    filePointer = logfile.length(); 
} 

try { 
    // Start tailing 
    tailing = true; 
    RandomAccessFile file = new RandomAccessFile(logfile, "r"); 
    while(tailing) { 
     // Compare the length of the file to the file pointer 
     long fileLength = logfile.length(); 
     System.out.println("filePointer = " + filePointer + " | fileLength = " + fileLength); 
     if(fileLength < filePointer) { 
     // Log file must have been rotated or deleted; 
     // reopen the file and reset the file pointer 
     file = new RandomAccessFile(logfile, "r"); 
     filePointer = 0; 
     } 

     if(fileLength > filePointer) { 
     // There is data to read 
     file.seek(filePointer); 
     String line = file.readLine(); 
     System.out.println("new line = " + line); 
     while(line != null){ 
      if(!line.isEmpty()) 
      try { 
       fireNewFileLine(line); 
      } catch (ParseException e) { 
       e.printStackTrace(); 
      } 
      line = file.readLine(); 
     } 
     filePointer = file.getFilePointer(); 
     } 
     // Sleep for the specified interval 
     sleep(sampleInterval); 

    } 

    // Close the file that we are tailing 
    file.close(); 
} 
catch(InterruptedException | IOException e){ 
    e.printStackTrace(); 
} 
} 

就像我說的,一切工作,因爲它應該在Windows,但在Linux上的字符串變量「線」爲NULL它應該已經充滿了新追加的行之後,所以fireNewLine被調用的NULL和一切都是廢話。

有沒有人有一個想法,爲什麼會發生在Linux系統上?

+0

沒有證據在這裏,'求()'的問題,但我不知道爲什麼你打電話'求()'都沒有。你不需要。你應該總是被定位在文件的末尾。除了您自己的'readLine()'調用外,沒有什麼會改變您在文件中的位置。 – EJP

+0

事實上,你並不需要'RandomAccessFile'。使用'BufferedReader',並在readLine()'返回null時睡覺。 – EJP

回答

0

你並不需要所有這些,或者RandomAccessFile。你總是在文件的末尾。所有你需要的是:

public void run() { 

    try { 
     // Start tailing 
     tailing = true; 
     BufferedReader reader = new BufferedReader(new FileReader(logfile)); 
     String line; 
     while (tailing) { 
      while ((line = reader.readLine() != null) { 
       System.out.println("new line = " + line); 
       if(!line.isEmpty()) { 
        try { 
         fireNewFileLine(line); 
        } catch (ParseException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
      // Sleep for the specified interval 
      sleep(sampleInterval); 
     } 
     // Close the file that we are tailing 
     reader.close(); 
    } catch(InterruptedException | IOException e) { 
     e.printStackTrace(); 
    } 
} 

可能有一些規定重新打開文件。

Ë& OE