Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.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 用旋转跟踪std输出文件,这会长期有效吗?_Java_Tail - Fatal编程技术网

Java 用旋转跟踪std输出文件,这会长期有效吗?

Java 用旋转跟踪std输出文件,这会长期有效吗?,java,tail,Java,Tail,我正在尝试实现一个日志跟踪程序,它将在前一个文件被删除并替换为新文件(永远)后继续跟踪。所以,我不必每次重启服务器(打印日志)时都运行这个程序 这是我的密码 public void tail(String file) throws InterruptedException, IOException { waitUntilFileExist(file); File f = new File(file); BufferedReader br = new BufferedR

我正在尝试实现一个日志跟踪程序,它将在前一个文件被删除并替换为新文件(永远)后继续跟踪。所以,我不必每次重启服务器(打印日志)时都运行这个程序

这是我的密码

public void tail(String file) throws InterruptedException, IOException {
    waitUntilFileExist(file);

    File f = new File(file);

    BufferedReader br = new BufferedReader(new FileReader(file.trim()));

    br.skip(f.length());
    String line = null;

    while (f.exists()) {

       f = new File(file);
        line = br.readLine();

        if (line == null) {

            Thread.sleep(1000);

        } else {
            if (msl != null) {
               //Send line to attached interface
                msl.onMessage(line);
            }
        }

    }

   waitUntilFileExist(file);

    tail(file);


}

public void waitUntilFileExist(String file) throws InterruptedException {
    File f = new File(file);
    if (!f.exists()) {
        System.out.println("File doesn't exists");
        Thread.sleep(1000);
        waitUntilFileExist(file);
    } else {
        System.out.println("File does exists");
    }
}
首先,它将检查指定的文件是否存在?当它确实存在时,读取文件并打印行。如果文件在读取时被删除,它将等待文件被重新创建,然后调用tail方法

我在Linux机器上进行了测试,效果很好,但我不确定这是否是正确的方法。 你有没有别的办法?
这对生产环境(如天和月)有效吗?

您的程序将因堆栈溢出错误而失败,因为每次您在两种方法
tail
waitUntilFileExist
中使用递归方法调用时,都会越来越深,并且永远无法从中退出。 我为您的代码制作了更好的变体:

public void tail(字符串文件)抛出InterruptedException、IOException{
布尔值isNeedRun=true;
while(isNeedRun){
waitUntilFileExist(文件);
试一试{
读取文件(文件);
}捕获(例外e){
e、 printStackTrace();
}
}
}
私有void readFile(字符串文件)引发InterruptedException,IOException{
文件f=新文件(文件);
FileReader=newFileReader(file.trim());
试一试{
BufferedReader br=新的BufferedReader(读卡器);
br.跳过(f.长度());
弦线;
而(f.exists()){
f=新文件(文件);
line=br.readLine();
如果(行==null){
睡眠(1000);
}否则{
如果(msl!=null){
//将线路发送到连接的接口
msl.onMessage(行);
}
}
}
}最后{
试一试{
reader.close();
}捕获(例外e){
e、 printStackTrace();
}
}
}
私有void waitUntilFileExist(字符串文件)引发InterruptedException{
文件f=新文件(文件);
而(!f.exists()){
System.out.println(“文件不存在”);
睡眠(1000);
}
System.out.println(“文件确实存在”);
}
但是这个变种也不完美!您可能会丢失一些行,因为可能会出现这样的情况,即在行之间将某些内容写入文件
waitUntilFileExist(文件)
br.skip(f.length())

如果您在unix系统上需要tail,最好使用tail控制台工具。您可以从java启动单独的进程并使用它的输出。当删除并再次创建文件时,此变量将保证0%的丢失