18

不管程序当前运行的平台如何,Java 中是否有确定给定路径是否为绝对路径的方法。所以,我想要的可能类似于以下示例:

在 Linux 上:

new File("/home/").isAbsolute() // Should return true.
new File("C:/My Documents").isAbsolute() // Should *also* return true.

在 Windows 上:

new File("C:/Documents").isAbsolute() // Should return true.
new File("/home/").isAbsolute() // Should *also* return true.

我可能可以编写一些代码来解决这个问题,但我只是想知道是否有人知道 Java 提供的一个内置类来解决这个问题。或者有没有人遇到过这个问题?你是怎么解决的?

谢谢!

4

4 回答 4

10

没有。

有一些底层FileSystem类(即 Java 7,但它们也存在于它之前)暴露了 isAbsolute(),但它们不是公共的 - 所以你不应该使用它们,即使你这样做了你的代码也会是充满了反射垃圾——JRE 中只包含“正确”的操作系统,所以无论如何你都必须围绕它们编写代码。

以下是 isAbsolute(...) 的 Java 7 实现,可帮助您入门。注意 File.getPrefixLength() 是包私有的。

Win32文件系统

public boolean isAbsolute(File f) 
{
        int pl = f.getPrefixLength();
        return (((pl == 2) && (f.getPath().charAt(0) == slash))
                || (pl == 3));
}

Unix文件系统

public boolean isAbsolute(File f) 
{
        return (f.getPrefixLength() != 0);
}
于 2009-06-22T03:00:10.433 回答
9

在 Java 7 中:

new File(path).isAbsolute()
于 2015-04-23T21:50:31.750 回答
3

我使用 Apache FilenameUtil 对此进行了破解-

   public static boolean isAbsolute(final String path) {
      return FilenameUtils.getPrefixLength(path) != 0;
   }

从技术上讲,这是返回 !relative。这对我的目的来说很好。

于 2014-07-30T00:15:56.233 回答
-1

我最终使用了这个(在 Java 6 中):

private static boolean testPath(String path) {
    int prefixLen = FilenameUtils.getPrefixLength(path);
    if (testPathWin(path, prefixLen) || testPathLinux(prefixLen))
        return true;
    else
        return false;
}

private static boolean testPathWin(String path, int prefixLen) {
    if (prefixLen == 3)
        return true;
    File f = new File(path);
    if ((prefixLen == 2) && (f.getPath().charAt(0) == '/'))
        return true;
    return false;
}

private static boolean testPathLinux(int prefixLen) {
    return (prefixLen != 0);
}
于 2013-09-11T11:09:46.947 回答