Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RandomAccessFile.seek()在Linux上不工作_Java_Linux_Io_Randomaccessfile - Fatal编程技术网

Java RandomAccessFile.seek()在Linux上不工作

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

我正在使用某种tail-f实现来跟踪文件的更改(非常类似于)。为此,我使用一个RandomAccessFile,定期检查文件长度是否增加,如果增加,则查找并读取新行(在FileTailer的单独线程中发生的所有事情)

现在,Windows上的一切都正常工作,但我在Linux上测试了我的程序,但它没有按预期工作。下面是FileTailer类的run()-方法。具体来说,在linux上失败的地方是调用file.seek(filePointer)然后调用file.readLine(),后者意外地返回NULL(尽管如果在运行时将内容追加到文件中,filePointer会正确递增)

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();
    }
}