给定相对或绝对路径以及它相对于的绝对路径时,如何获取文件的绝对路径

时间:2013-04-01 06:55:41

标签: java file

假设我有一条绝对的“基础”路径:

/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 个答案:

答案 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)

查看File#getCanonicalPath

来自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是任意路径名,可能是相对的,也可能不是。