Java,将任何文件复制到新的根路径

时间:2015-04-26 11:36:43

标签: java path filesystems

我希望能够将任何文件复制到我的程序的相对路径。如何进行路径操作以便它可以在任何OS /文件系统上运行?

Windows文件系统的一些示例

<App />

编辑:另一种提问方式:如何将任何文件移动到特定文件夹,尽可能多地保留原始路径并避免任何冲突。困难的部分是2个文件在Windows上具有相同的路径,具有不同的驱动器号。那么其他文件系统呢?

EDIT2:一般来说,人们要快速投票。如果用户已经注意到他们会注意到这个例子,那么棘手的部分就是根名称。我猜他们贬低了,认为这个问题很简单。删除这个问题或其他什么,我不在乎。感谢fge的好回答。

2 个答案:

答案 0 :(得分:3)

你不能以便携的方式做到这一点。即使使用JSR 203。

Path分为两部分:

  • 根(可能是null);
  • 名称组件列表。

你遇到的一个问题是根。

对于Unix系统,例如,如果我们采用路径/foo/bar,您可以:

  • root:/;
  • 名称组件:foobar

在Windows上,c:\foo\bar包含部​​分:

  • root:c:;
  • 名称组件:foobar

这意味着为了达到你想要的效果,你必须先检查root并将其变成一个名字组件。

因此,这将是一个黑客......但这是一种可能性:

// Supposes that the original path has a root
public static Path toNameComponents(final Path orig)
{
    final Path root = orig.getRoot();
    final Path components = root.relativize(orig);
    final Path mangledRoot = rootToComponents(root);
    return mangledRoot.resolve(components);
}

然后,您的rootToComponents()方法将从c生成c:,并在Unix系统上生成空路径。

之后,问题是.resolve()

现在,关于为什么你不能最终以可移植的方式实现它的真正原因:JSR 203并没有强制要求绝对路径具有根...这恰好就是Windows和Unix文件系统,因为它们是分层的。

答案 1 :(得分:-1)

大多数时候你不需要做任何事情。 Java处理各种格式,使用File.getPath时,它返回系统分隔符的路径。如果您在某个时刻确实需要了解操作系统的路径分隔符,请使用File.separatorSystem.getProperty("path.separator")

例如,所有这些都打印C:\JavaWork\Scala\Test\test.txt

System.out.println(new File("C:/JavaWork/Scala/Test/test.txt").getAbsolutePath());
System.out.println(new File("C:\\JavaWork\\Scala\\Test\\test.txt").getAbsolutePath());
System.out.println(new File("C://JavaWork//Scala//Test//test.txt").getAbsolutePath());