java - 无法连续读取/监视远程文件

标签 java sftp jsch

我正在使用 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 协议(protocol)的较低级别访问。

关于java - 无法连续读取/监视远程文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31246546/

相关文章:

java - 如何向 WebView 添加 Drawable

python ftplib.error_perm : 500 Protocol not supported

java - 如何使用 Java 将远程 SFTP 服务器中存储的文件复制到同一远程服务器中的另一个文件夹?

c++ - 将 sftp 协议(protocol)与 libcurl 一起使用——如何列出目录的内容?

linux - 使用 SFTP 在基于 Windows 的服务器(主机)和 Linux 服务器(客户端)之间进行同步

java - 当还必须切换用户时使用 JSch 到 SFTP

java - 将私钥从 PuTTY 格式转换为 OpenSSH 格式后,是否需要向服务器添加新的公钥?

Java文本编辑器/解析框架

java - 如何在 TextView 中设置带重音的文本?

java - 用java限制文件写入?