从服务器通过sftp读取巨大的动态文件的结尾

时间:2018-03-27 14:37:41

标签: java sftp

我试图通过服务器的sftp找到一种方法来读取巨大的动态日志文件的结尾(比如20-30行),并保存点直到我读到的地方,如果我需要更多行,从这一点上读更多。我尝试过的所有东西花了太长时间,我试图在机器上复制这个文件,然后使用ReversedLinesFileReader从头读取,因为这个方法需要File对象,当通过sftp你只得到InputStream时,需要花很多钱下载文件。还试图计算行数并从n行读取但也花费太长时间并抛出异常,因为在此时间文件中的某个时间被修改。另一种方法我尝试通过ssh连接并使用tail -100并获得所需的结果,但只是一次,因为下次我还会得到新的日志,但我需要去上层。是否有一种快速的方法来获取文件的结尾并保存点并稍后阅读更多的这一点?有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您不会说出您正在使用的SFTP库,但最广泛使用的java ssh库是jsch,所以我假设您正在使用它。

SFTP protocol具有对远程文件执行随机访问I / O的操作。不幸的是,JSCH SFTP客户端并未公开所有操作。但是,它确实具有get operation的版本(用于从远程服务器获取文件),允许跳过远程文件的第一部分。您可以使用其中一个操作来读取文件的最后10 KB。

一些JSCH get操作返回InputStream。您可以从输入流中读取远程文件的内容。如果您想逐行访问远程文件,可以使用Reader将其转换为InputStreamReader

因此,一个过程可能会执行以下操作:

  1. 调用远程文件上的stat()以获取其大小。
  2. 找出您要从中开始阅读的文件的位置。您可以跟踪上次停止阅读的位置,也可以根据您愿意下载的数据量以及最后20-30行的预期字节数来猜测。
  3. 致电get()开始阅读。
  4. InputStream调用返回的get()读取的处理数据。

答案 1 :(得分:1)

最好是拥有一种旋转日志文件,可能还有压缩。

Hower rsync是单向同步,只能传输文件的已更改部分:对于日志新端。

我不确定它在你的情况下是否足够高效,nominal_score_test(estimates_glm_tbl$class_prob) Error in ans[!test & ok] <- rep(no, length.out = length(ans))[!test & : replacement has length zero In addition: Warning message: In rep(no, length.out = length(ans)) : 是先决条件。