【问题标题】:How to copy a file from one URL to another without storing on local machine如何将文件从一个 URL 复制到另一个而不存储在本地计算机上
【发布时间】:2014-03-06 13:27:21
【问题描述】:

我正在开发一个类似 DeployIt 的应用程序,其中一个文件(例如 JAR)必须从一台服务器复制并粘贴到另一台服务器。最重要的方面是它必须以原子方式完成,没有中间环境(如 localhost)。

我已设法将文件从一台服务器复制到本地计算机,然后再复制到目标服务器,但此操作非常耗时,我们负担不起。

URL url = new URL(path);
File result = new File("C:\\" + fileName);
FileUtils.copyURLToFile(url, result); // copy to local machine
FileObject localFile = manager.resolveFile(f.getAbsolutePath());
FileObject remoteFile = manager.resolveFile(
            createConnectionString(hostname, username, password, remoteFilePath, f.getName()), createDefaultOptions());

remoteFile.copyFrom(localFile, Selectors.SELECT_SELF); // copy to target server

如何一步完成?

【问题讨论】:

  • 您有这些服务器的 CLI 访问权限吗?如果是,您是否尝试过 scp/rsync?
  • 你不能这样做。即使您没有“正式”将文件存储在本地主机上的文件系统上,也必须将其全部下载到您的机器上,然后发送到另一台服务器。
  • 您使用哪些 API? FileUtils 是什么? FileObject 是什么?
  • @user11153 抱歉,这是错误的;您可以使用内存缓冲区来做到这一点。不过,这并非没有风险。
  • @fge 即使使用内存缓冲区,您也正在逐块下载,但最终仍然是完整的(但不是一次完整,是的)。

标签: java file url copy vfs


【解决方案1】:

如果您可以从源套接字获取InputStream,从目标套接字获取OutputStream,则可以使用避免复制到文件中的方法,例如:

public static void copyStream(final InputStream in, final OutputStream out)
    throws IOException
{
    final byte[] buf = new byte[32768]; // or more, or less; size appropriately
    int nrBytes;

    while ((nrBytes = in.read(buf)) != -1)
        out.write(buf, 0, nrBytes);

    out.flush();
}

但是,在采用这种方式并避免中间有临时文件之前,请考虑一下如果您进行短读或短写会发生什么;在这种情况下,端点的行为如何?

另外,请注意此方法不会关闭任一流;你必须自己做。

【讨论】:

    【解决方案2】:

    您可以使用 UNC 路径映射驱动器(如果您有访问权限)。它会很快,因为它使用了很快的CIFS 协议。语法类似于。

    new File("//SERVER/some/path").toURI().toString() -> "file:////SERVER/some/path
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-01
      • 2020-07-26
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多