Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.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 Can';t连续读取/监视远程文件_Java_Sftp_Jsch - Fatal编程技术网

Java Can';t连续读取/监视远程文件

Java Can';t连续读取/监视远程文件,java,sftp,jsch,Java,Sftp,Jsch,我使用JSCH尝试在一个不断更新的独立服务器上读取日志文件。我可以很好地提取文件中当前的任何内容,但一旦到达文件末尾,就会出现延迟,但不会提取新行,并且延迟打印语句会继续循环(我通过在程序旁边的日志上运行尾部来验证)。如果有人能指出我的代码中可能有错误或遗漏的地方,或者提出更好的方法,我将不胜感激 InputStream stream = sftpClient.get(filename); BufferedReader br = new BufferedReader(new InputStrea

我使用JSCH尝试在一个不断更新的独立服务器上读取日志文件。我可以很好地提取文件中当前的任何内容,但一旦到达文件末尾,就会出现延迟,但不会提取新行,并且延迟打印语句会继续循环(我通过在程序旁边的日志上运行尾部来验证)。如果有人能指出我的代码中可能有错误或遗漏的地方,或者提出更好的方法,我将不胜感激

InputStream stream = sftpClient.get(filename);
BufferedReader br = new BufferedReader(new InputStreamReader(stream));
String line;
while (true)
{
    try
    {
        line = br.readLine();
        if (line == null)
        {
            System.out.println("End of file reached. Sleeping..");
            Thread.sleep(sleepTime);
            System.out.println("Retrying for more data..");
        }
        else
        {
            //do something with line, print for now.
            System.out.println(line);
        }
    }
    catch (Exception e)
    {
        System.out.println("Something went wrong: " + e);
    }
}

我想你应该在结束时重新打开文件。 如果出于生产目的,请尝试使用ApacheTailer

为了补充crv提到的内容,下面是一个关于如何使用Apache
Tailor

import java.io.File;

import org.apache.commons.io.input.Tailer;
import org.apache.commons.io.input.TailerListener;
import org.apache.commons.io.input.TailerListenerAdapter;

public class FileTailor {

    private static final int SLEEP = 500;

    public static void main(String[] args) throws Exception {
        FileTailor fileTailor = new FileTailor();
        fileTailor.run("log_file.log");
    }

    private void run(String path) throws InterruptedException {
        TailerListener listener = new LogFileListener();
        Tailer tailer = Tailer.create(new File(path), listener, SLEEP);
        tailer.run();
    }

    public class LogFileListener extends TailerListenerAdapter {
        @Override
        public void handle(String line) {
            //do something with line, print for now.
            System.out.println(line);
        }
    }
}

您可以看到Jsch的
ChannelSftp
的源代码。获取远程文件时,将在读取到远程文件末尾时设置标志。继续尝试从流中读取只会返回缓存的EOF指示

Jsch有,包括它的大小和最后修改的时间戳。Jsch还有一个可以跳过远程文件第一部分的功能。您可以定期调用stat()来检测文件是否已更改,然后使用get()跳过文件中已读取的部分,然后只读取新内容


您可能还想考虑使用不同的SSH客户端库。包含用于打开远程文件和读取或写入文件任意部分的低级命令。然而,Jsch并没有通过ChannelSftp公开此功能的全部范围。还有其他java SFTP客户端库提供对SFTP协议的较低级别访问。

我正在尝试,在我的情况下,我必须连续读取日志,但我只能通过SFTP访问它,正如@Kenster提到的,我通过调用
stat()
检查文件大小是否已更改,然后使用
get(String src、String dst、sftprogressmonitor monitor、int mode)
,它所做的是在我的目录中生成一个新文件,并且使用
RESUME
中的mode参数,它只接受最新的内容

长远程指针=0;
SftpATTRS-atrr=null;
Strinf remoteFile=“log.txt”
Strinf tempFile=“/tmp/data/log.txt”
while(true){
试试{
atrr=channelSftp.stat(远程文件);
if(atrr.getSize()>remotepointer){
remotepointer=atrr.getSize();
get(remoteFile,tempFile,null,channelSftp.RESUME);
}
}捕获(例外e){
System.out.println(“出错:+e”);
}
}

对于通过SFTP访问的远程系统上的文件,这不太可能起作用。我想我必须通过文件大小检查路径,谢谢您提供的所有信息。!