使用 java.nio.file.Files.copy() 将文件从 Linux 复制到 Windows 远程机器

问题描述

我正在开发 Spring Boot 应用程序,我需要将文件复制到远程机器。

当我在 Windows 机器上运行该程序时,它运行良好。代码如下:

void copyImage(multipartfile image,String name) {

    name = name + "." + FileUtils.getExtension(image);

    Path path = Paths.get("\\<remote-machine>\path\to\repository\" + name);

    try {
        Files.copy(image.getInputStream(),path,StandardcopyOption.REPLACE_EXISTING);
    } catch (IOException e) {
        // Handle exception here
    }
}

正如预期的那样,当我在 Linux (Pop!_OS) 上运行该程序时,它不起作用。我相信传递给 Paths.get() 的参数格式不正确,因为 Windows 和 Linux 对待路径的方式不同。知道如何在 Linux 上使用这种方法吗?

解决方法

Linux 本身不支持 UNC paths - 它不明白这样的路径是指网络共享。您有多种选择:

  • 使用通过 SMB 协议实现网络共享访问的 Java 库。一些积极支持的库是 JCIFSSMBJ。这应该使您的应用程序可移植(您可以在 Linux 和 Windows 上运行它),但您依赖于一个额外的库,并且必须使用其自定义 API 来访问远程文件
  • 在 Linux 上将远程共享挂载为 CIFS 卷 (official Ubuntu guide)。然后远程共享就可以访问了,就好像它是 Linux 上的本地目录一样。在这种情况下,您可以继续使用 java.nio 访问/复制文件,但需要确保将共享的根路径设为可配置(例如,Windows 上的 \\host\share 和 Linux 上的 /mnt/share ).

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...