我希望能够将任何文件复制到我的程序的相对路径。如何进行路径操作以便它可以在任何OS /文件系统上运行?
Windows文件系统的一些示例
<App />
编辑:另一种提问方式:如何将任何文件移动到特定文件夹,尽可能多地保留原始路径并避免任何冲突。困难的部分是2个文件在Windows上具有相同的路径,具有不同的驱动器号。那么其他文件系统呢?
EDIT2:一般来说,人们要快速投票。如果用户已经注意到他们会注意到这个例子,那么棘手的部分就是根名称。我猜他们贬低了,认为这个问题很简单。删除这个问题或其他什么,我不在乎。感谢fge的好回答。
答案 0 :(得分:3)
你不能以便携的方式做到这一点。即使使用JSR 203。
Path
分为两部分:
null
); 你遇到的一个问题是根。
对于Unix系统,例如,如果我们采用路径/foo/bar
,您可以:
/
; foo
,bar
。在Windows上,c:\foo\bar
包含部分:
c:
; foo
,bar
。这意味着为了达到你想要的效果,你必须先检查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.separator
或System.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());