Java RandomAccessFile.seek()在Linux上不工作
我正在使用某种tail-f实现来跟踪文件的更改(非常类似于)。为此,我使用一个RandomAccessFile,定期检查文件长度是否增加,如果增加,则查找并读取新行(在FileTailer的单独线程中发生的所有事情) 现在,Windows上的一切都正常工作,但我在Linux上测试了我的程序,但它没有按预期工作。下面是FileTailer类的run()-方法。具体来说,在linux上失败的地方是调用file.seek(filePointer)然后调用file.readLine(),后者意外地返回NULL(尽管如果在运行时将内容追加到文件中,filePointer会正确递增)Java RandomAccessFile.seek()在Linux上不工作,java,linux,io,randomaccessfile,Java,Linux,Io,Randomaccessfile,我正在使用某种tail-f实现来跟踪文件的更改(非常类似于)。为此,我使用一个RandomAccessFile,定期检查文件长度是否增加,如果增加,则查找并读取新行(在FileTailer的单独线程中发生的所有事情) 现在,Windows上的一切都正常工作,但我在Linux上测试了我的程序,但它没有按预期工作。下面是FileTailer类的run()-方法。具体来说,在linux上失败的地方是调用file.seek(filePointer)然后调用file.readLine(),后者意外地返回N
public void run(){
//文件指针跟踪我们在文件中的位置
长文件指针=0;
//确定起点
如果(开始){
filePointer=0;
}
否则{
filePointer=logfile.length();
}
试一试{
//开始跟踪
拖尾=正确;
RandomAccessFile文件=新的RandomAccessFile(日志文件,“r”);
同时(跟踪){
//将文件的长度与文件指针进行比较
long fileLength=logfile.length();
System.out.println(“filePointer=“+filePointer+”| fileLength=“+fileLength”);
if(文件长度<文件指针){
//日志文件必须已被旋转或删除;
//重新打开文件并重置文件指针
文件=新的随机访问文件(日志文件,“r”);
filePointer=0;
}
如果(文件长度>文件指针){
//有数据需要读取
seek(filePointer);
字符串行=file.readLine();
System.out.println(“新行=”+行);
while(行!=null){
如果(!line.isEmpty())
试一试{
fireNewFileLine(行);
}捕获(解析异常){
e、 printStackTrace();
}
line=file.readLine();
}
filePointer=file.getFilePointer();
}
//按指定的时间间隔睡眠
睡眠(采样间隔);
}
//关闭我们正在跟踪的文件
file.close();
}
捕获(中断异常| IOE异常){
e、 printStackTrace();
}
}
就像我说的,在Windows上一切都正常工作,但在Linux上,字符串变量“line”在应该用新添加的行填充后为NULL,因此fireNewLine在NULL上被调用,一切都变得一团糟
有人知道为什么在Linux系统上会发生这种情况吗?您不需要所有这些,或者
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();
}
}
可能有一些重新打开文件的规定
E&OE这里没有证据表明问题出在
seek()
,但我根本不知道你为什么要调用seek()
。你不需要。您应该始终位于文件的末尾。除了您自己的readLine()
调用之外,任何东西都不会改变您在文件中的位置。事实上,您根本不需要RandomAccessFile
。使用BufferedReader
,在readLine()
返回null时只需睡眠。
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();
}
}