Java 在文件被更改/覆盖时从ftp服务器下载文件

Java 在文件被更改/覆盖时从ftp服务器下载文件,java,ftp,stream,Java,Ftp,Stream,我们正在从FTP服务器下载一个文件。文件内容有时会更改。文件名始终相同 这种情况可能吗 文件内容为“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa” 我们开始下载 文件被覆盖,看起来像“bbbbbbbbbbbb” 我们得到的文件内容是“aaaabbbbb” 用于下载的库是ApacheCommonsNet 使用的代码是

我们正在从FTP服务器下载一个文件。文件内容有时会更改。文件名始终相同

这种情况可能吗

  • 文件内容为“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”
  • 我们开始下载
  • 文件被覆盖,看起来像“bbbbbbbbbbbb”
  • 我们得到的文件内容是“aaaabbbbb”
  • 用于下载的库是ApacheCommonsNet

    使用的代码是:

    FTPClient ftpClient = new FTPClient();
    //client connecting code...
    //...
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    ftpClient.retrieveFile(path, outputStream);
    outputStream.writeTo(new FileOutputStream(new File("myFile.txt")));
    

    这实际上是可能发生的。因此,我建议您在下载之前获取文件的校验和。(使用FTP site命令在服务器上执行脚本以获得校验和)然后在下载后,与下载文件的校验和进行比较。

    是的,根据FTP服务器的实现方式以及文件写入其服务区域的方式,可能会出现这种情况

    在FTP客户端/协议级别,您无法处理此问题


    但是,您可以通过让服务器端应用程序生成并写入更新文件的校验和或散列,并将其写入FTP区域,从而在应用程序级别解决此问题。然后,客户端可以读取数据文件和校验和文件,并检查数据文件的校验和是否正确。如果它们不匹配,补救方法是再次获取这两个文件。

    如果您使用的是unix服务器,则文件在下载过程中不应更改。连接中断后,您无法阻止更改。但若要不更改正在下载的文件,您应该更改上载或创建文件到FTP服务器的过程。首先将文件上载到临时文件名中。我在bash中使用$RANDOM,这并不重要,.tmp后缀就足够了,只要同一目录中不存在samename.tmp作为合法文件。然后执行mv tempname.tmp samename。Move是unix服务器上的原子操作。这意味着启动的用户将继续下载原始文件。移动后打开文件的用户将开始下载新文件。当FTP服务器打开的所有句柄关闭时,旧文件将被内核删除。

    FTP应确保永远不会发生这种情况。如果可能的话,这是FTP服务器的故障,您无法在客户端对此进行任何处理。另外,在处理任意文件时,您几乎不应该使用ByteArrayOutputStream。你只是要求耗尽内存。您应该将FileOutputStream传递给
    retrieveFile()
    调用。我从未使用过SITE命令。我只能通过FTP访问。我不能上传脚本到FTP服务器。有没有一种不用脚本计算校验和的方法?如果你不能让FTP管理员代表你安装脚本,另一个可以做的事情就是在传输前后检查时间戳。我无法访问FTP服务器。