当前位置: 首页 > 面试题库 >

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

郭鸿信
2023-03-14
问题内容

我正在尝试找到一种方法,可以通过SFTP从服务器读取大型动态日志文件的末尾(如末尾20-30行),并将该点保存到读取的位置,如果需要读取更多行,则可以读取更多内容从这一点上来看。

我尝试过的所有事情都花费了很长时间,我试图将其复制到计算机上,然后再从终端读取以使用ReversedLinesFileReader该方法File,因为这种方法需要对象,通过SFTP时,您只会得到InputStream很多东西,而下载文件需要很多时间。

还尝试对行进行计数并从n行读取,但是也花费了太长时间并引发异常,因为此时间中的某个时间文件已被修改。我尝试通过SSH连接并使用tail -100并获得所需结果的另一种方法,但这只是一次,因为下一次我还将获得新的日志,但是我需要向上移动。有没有一种快速的方法来获取文件结尾并保存该点,并在以后读取该点的更多内容?任何想法?


问题答案:

您没有说使用什么SFTP库,但是使用最广泛的Java SSH /
SFTP库是JSch,所以我假设您正在使用它。

该SFTP协议具有操作在远程文件执行随机存取的I / O。不幸的是,JSch
SFTP客户端没有公开全部操作。但是,它确实具有该get操作的版本(用于从远程服务器获取文件),该版本允许跳过远程文件的第一部分。您可以使用这些操作之一来读取例如文件的最后10 KB。

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

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

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


 类似资料:
  • 我正在从sftp服务器读取文件,并使用Spring Batch Framework将该文件加载到数据库中。下面是我的代码,但我遇到了一个错误 代码: 错误:

  • 问题内容: 我目前正在尝试从Python 2.7中的.csv文件中读取数据,该文件最多包含100万行和200列(文件范围从100mb到1.6gb)。对于少于300,000行的文件,我可以(非常缓慢地)执行此操作,但是一旦超过该行,就会出现内存错误。我的代码如下所示: 在getstuff函数中使用else子句的原因是,所有符合条件的元素都将一起列在csv文件中,因此当我经过它们时,为了节省时间,我离

  • 问题内容: 我正在尝试使用Java从使用SFTP(而不是FTPS)的服务器检索文件。我怎样才能做到这一点? 问题答案: 另一个选择是考虑查看JSch库。JSch似乎是一些大型开源项目的首选库,其中包括Eclipse,Ant和Apache Commons HttpClient。 它很好地支持用户/通过和基于证书的登录,以及所有其他许多美味的SSH2功能。 这是通过SFTP检索的简单远程文件。错误处理

  • 我想用定制的发布

  • 问题内容: 我目前正在尝试从Python 2.7中的.csv文件中读取数据,该文件最多包含100万行和200列(文件范围从100mb到1.6gb)。对于少于300,000行的文件,我可以(非常缓慢地)执行此操作,但是一旦超过该行,就会出现内存错误。我的代码如下所示: 在getstuff函数中使用else子句的原因是,所有符合条件的元素都将一起列在csv文件中,因此,经过它们以节省时间时,我离开了循

  • 我的问题是: > 如何使其与较大的文件一起工作? 有什么办法能让它快一点吗? 我的电脑有8GB的RAM,运行64位Windows 7,处理器是3.40GHz(不确定你需要什么信息)。