Java 将绝对路径名转换为子路径的最佳方式是什么?

Java 将绝对路径名转换为子路径的最佳方式是什么?,java,absolute-path,Java,Absolute Path,我正在使用Java编写一个备份程序,我想根据源的绝对路径名将文件和目录保存到备份目标 备份程序应该在不同的操作系统(Unix、Windows、Mac OS X)下工作,因此我需要转换源文件和目录的绝对路径名 最后,我想把一个绝对源路径转换成目标的一个常规子路径。让我举几个例子 Unix 绝对源路径:/home/thomas/data 目标路径:/backup 有效目的地:/backup/home/thomas/data Windows 绝对源路径:c:\Documents and Setting

我正在使用Java编写一个备份程序,我想根据源的绝对路径名将文件和目录保存到备份目标

备份程序应该在不同的操作系统(Unix、Windows、Mac OS X)下工作,因此我需要转换源文件和目录的绝对路径名

最后,我想把一个绝对源路径转换成目标的一个常规子路径。让我举几个例子

Unix
绝对源路径:/home/thomas/data
目标路径:/backup
有效目的地:/backup/home/thomas/data

Windows
绝对源路径:c:\Documents and Settings\thomas
目标路径:e:\backup
有效目标:e:\backup\c\Documents and Settings\thomas

我可以使用字符串替换操作,但我希望遇到一些麻烦,并开始一个永无止境的更正故事

我认为Windows环境需要特殊处理,因为驱动器号是前导的。在*nix下,我可以简单地连接两条路径。还请注意,源路径可以是Windows下的UNC路径,如\\share\data

我四处搜索,发现了几个类似的问题,但没有一个能回答我的问题(例如或)


可能有人对我有什么想法或提示,或者知道有一个库已经完成了我所寻求的功能。

如果您使用的是Java 7或更高版本,那么
路径
类及其方法可能很有用。这里有很好的概述:

特别是对于您的用例,您需要
子路径
(获取路径的一部分)和
解析
(组合两个路径)。我想试试这样的东西:

Path backupRoot = Paths.get("/backup");
Path docRoot = Paths.get("/home/user1/docs");
// This line gets the full doc path without the root
Path docs = docRoot.subpath(0, docRoot.getNameCount());
// This line creates the path "/backup/home/user1/docs"
Path backupDocs = backupRoot.resolve(docs);

你试过什么吗?嗯,也许我不明白,但是你链接中的方法可以用来计算两条路径之间的“关系”。我喜欢的是基于绝对源路径和目标路径创建一个新的子路径。但是你说的是哪种方法呢?非常感谢你的调查和详细的回答。我用docRoot\\server\c$\Windows、c:\Windows、U:\尝试了一个小的代码示例,但失败了,最后一个代码出现异常。还请注意,我希望在我的目标路径中保持根目录(如“server/c$”、“c:”或“u:”)可见。请参阅我问题中的示例。为此,您可以在docRoot路径上使用
getRoot
,并获取第一个字符,然后在备份路径中插入一个额外的目录(如果第一个字符是字母,请再次使用
resolve
)。