1

假设我有一个绝对的“基本”路径:

/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。

有什么想法吗?非常感谢!

4

4 回答 4

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,我将使用类似的东西(NB 没有经过全面测试!):

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();
    }

}

于 2013-04-01T07:44:14.627 回答
0

看一眼File#getCanonicalPath

来自 JavaDocs:

返回此抽象路径名的规范路径名字符串。规范路径名是绝对且唯一的。规范形式的精确定义取决于系统。如果需要,此方法首先将此路径名转换为绝对形式,就像调用 getAbsolutePath() 方法一样,然后以系统相关的方式将其映射到其唯一形式。这通常涉及删除冗余名称,例如“。” 和路径名中的“..”,解析符号链接(在 UNIX 平台上),并将驱动器号转换为标准大小写(在 Microsoft Windows 平台上)。

每个表示现有文件或目录的路径名都有唯一的规范形式。每个表示不存在的文件或目录的路径名也具有唯一的规范形式。不存在的文件或目录的路径名的规范形式可能与创建文件或目录后相同路径名的规范形式不同。类似地,现有文件或目录的路径名的规范形式可能与删除文件或目录后相同路径名的规范形式不同。

于 2013-04-01T07:01:56.423 回答
0

在你的代码中试试这个。

System.setProperty("user.dir", "your_base_path")

于 2013-04-01T07:46:41.463 回答
0

不确定这是否适用于我的设置(Windows 平台,JRE 1.6.x)

但以下工作就像一个把戏:

File path = new File(relativeOrAbsoluteGoldpath);
absolutePath = path.getCanonicalPath();

whererelativeOrAbsoluteGoldpath是一个任意路径名,它可能是相对的,也可能不是相对的。

于 2014-01-14T16:16:55.553 回答