我正在使用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);
    }
}

最佳答案

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

Jsch具有a stat() method to retrieve information about a remote file,包括其大小和最后修改的时间戳。 Jsch还具有a version of the get method,可让您跳过远程文件的第一部分。您可以定期调用stat()来检测文件是否已更改,然后使用get()跳过文件中已经读取的部分,而只是读取新内容。

您可能还需要考虑使用其他SSH客户端库。 SFTP protocol包含用于打开远程文件以及读取或写入文件的任意部分的低级命令。但是,Jsch并未通过ChannelSftp公开此功能的全部范围。还有其他Java SFTP客户端库,它们提供对SFTP协议的较低级别的访问。

10-05 22:49
查看更多