我正在使用某種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系統上?
沒有證據在這裏,'求()'的問題,但我不知道爲什麼你打電話'求()'都沒有。你不需要。你應該總是被定位在文件的末尾。除了您自己的'readLine()'調用外,沒有什麼會改變您在文件中的位置。 – EJP
事實上,你並不需要'RandomAccessFile'。使用'BufferedReader',並在readLine()'返回null時睡覺。 – EJP