【问题标题】:Compute checksum of remote file in Java用Java计算远程文件的校验和
【发布时间】:2014-07-22 08:00:49
【问题描述】:

我正在使用 commons VFS 通过 sftp 传输文件。复制完成后,我想比较源文件和目标文件的校验和。

如何在 java 中找到远程文件的校验和?对于本地文件,我使用FileUtils.checksum()

【问题讨论】:

  • 我不知道有任何 SFTP 命令(本机或通过 VFS)可以为您提供远程文件的校验和。但是stackoverflow.com/questions/16216902/… 似乎暗示 SFTP 会即时进行完整性检查,所以这可能毫无意义......不过,如果这很重要,因为您使用的是 SFTP,您可能可以通过 SSH 访问远程主机。给定一个 SSH 会话,您可以要求远程服务器计算校验和(可能通过 openssl)。

标签: java sftp checksum


【解决方案1】:

这取决于您使用的校验和实现(例如 CRC32 等)。

我们以CRC32为例。您创建一个 CRC32 实例,并用越来越多的字节对其进行更新。这非常适合您尝试执行的任务,因为您可以在输入流中有更多可用字节时进行更新。

这是一个半生不熟的例子:

public long checksumRemote(InputStream inputStream) {
    CRC32 checksum = new CRC32();
    boolean finished = false;
    byte[] buffer = new byte[4096];

    while (!finished) {
        int bytesRead = inputStream.read(buffer);
        if (bytesRead < 0) {
            finished = true;
        } else if (bytesRead > 0) {
            checksum.update(buffer, 0, bytesRead);
        }
    }

    return checksum.getValue();
}

【讨论】:

  • 是的,但是您正在计算来自 SFTP 流的字节。因此,您最终计算的是本地文件的校验和,而不是远程文件。 (尽管您可能会争辩说,由于 SFTP 是动态校验和,并且由于您对流进行校验和,因此将动态计算的校验和与最终文件的校验和进行比较就足够了,我认为 OP 考虑了直接比较最后一个的远程校验和)
  • 有人建议下载远程文件和校验和比较。这将是性能损失。
猜你喜欢
  • 2011-10-11
  • 2012-05-18
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
相关资源
最近更新 更多