我正在使用 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/