假设我有一条绝对的“基础”路径:
/home/someone/dir1/dir2/
用户可以向我传递一条新路径,该路径可以是绝对路径,也可以是相对于路径路径,因此以下两者都有效:
..
/home/someone/dir1/
如何让java给出正确的绝对路径,即两种情况:
/home/someone/dir1/
以平台无关的方式做到这一点?
我尝试了以下内容:
File resolvedFile = new File((new File(basePath).toURI().resolve(new File(newPath).toURI())));
但是,在newPath是相对的情况下,newFile(newPath)会自动针对当前工作目录解析它,而不是我想要提供的basePath。
有什么想法? 非常感谢!
答案 0 :(得分:1)
回答我自己的问题..
似乎可以使用Path:
在java 7中完成Path p1 = Paths.get("/home/joe/foo");
// Result is /home/joe/foo/bar
System.out.format("%s%n", p1.resolve("bar"));
由于我的Mac 10.5.8无法获得java 7,所以我会选择类似的东西(注意不要经常测试!):
static String getAbsolutePath(String basePath, String relativeOrAbsolutePath) throws IOException {
boolean isAbsolute = false;
File relativeOrAbsoluteFile = new File(relativeOrAbsolutePath);
if (relativeOrAbsoluteFile.isAbsolute()){
isAbsolute = true;
}
if (isAbsolute){
return relativeOrAbsolutePath;
}
else {
File absoluteFile = new File(basePath, relativeOrAbsolutePath);
return absoluteFile.toString();
}
}
boolean isAbsolute = false;
File relativeOrAbsoluteFile = new File(relativeOrAbsolutePath);
if (relativeOrAbsoluteFile.isAbsolute()){
isAbsolute = true;
}
if (isAbsolute){
return relativeOrAbsolutePath;
}
else {
File absoluteFile = new File(basePath, relativeOrAbsolutePath);
return absoluteFile.toString();
}
}
答案 1 :(得分:0)
来自JavaDocs:
返回此抽象路径名的规范路径名字符串。一个 规范路径名是绝对的和唯一的。准确的定义 规范形式的系统依赖于系统。此方法首先转换它 必要时路径名为绝对形式,就好像通过调用 getAbsolutePath()方法,然后将其映射到其中的唯一形式 系统相关的方式。这通常涉及删除冗余名称 如 ”。”和路径名中的“..”,解析符号链接(on UNIX平台),并将驱动器号转换为标准情况(on Microsoft Windows平台)。
表示现有文件或目录的每个路径名都具有唯一性 规范形式。表示不存在的文件或的每个路径名 目录也有一个独特的规范形式。规范的形式 不存在的文件或目录的路径名可能与 文件或目录之后的相同路径名的规范形式 创建。类似地,现有路径名的规范形式 文件或目录可能与规范形式不同 删除文件或目录后的路径名。
答案 2 :(得分:0)
在您的代码中尝试此操作。
System.setProperty(“user.dir”,“your_base_path”)
答案 3 :(得分:0)
不确定这是否适用于我的设置(Windows平台,JRE 1.6.x)
但是以下工作就像一个技巧:
File path = new File(relativeOrAbsoluteGoldpath);
absolutePath = path.getCanonicalPath();
其中relativeOrAbsoluteGoldpath
是任意路径名,可能是相对的,也可能不是。