Java:如何找出路径是否为绝对路径,而不考虑操作系统

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中提供的内置类来解决这个问题。或者是否有人遇到过这个问题?你是如何解决的?

谢谢!


1
在Linux上,“c:/my documents”这样的路径可能是无效的,而且肯定不是绝对路径。在实现POSIX标准的系统中,所有路径都存在于单个“根”下,因此绝对路径始于该根。因此,绝对路径总是以“/”开头。其他任何内容都被视为相对于进程的当前工作目录。在Linux上,“C:/…”被认为是指当前工作目录内名为“C:”的目录,这很可能是无意义的。 - SingleNegationElimination
1
你的问题有点不太合理。想象一下一个假设的操作系统,其中所有路径都是绝对路径。假设在这个操作系统上有Java。因此,为了满足您的要求,您需要一个isFileAbsolute()方法,它始终返回true,无论程序当前运行的平台如何。很容易实现,但毫无意义。 - Erich Kitzmueller
我有一个情况,用户在远程计算机上配置了一个工作目录。远程计算机可以运行Unix或Windows(尽管最常见的情况是本地机器是Windows,远程机器是Unix)。需要验证用户指定的路径,并确定路径是否为绝对路径。 - Santosh Tiwari
1
file.isAbsolute()请参见[https://dev59.com/p2sz5IYBdhLWcg3w17fQ][1]。 - Vlad Patryshev
4个回答

10

不行。

有一些底层的FileSystem类(这是Java 7,但之前也存在)会公开isAbsolute()方法,但它们并不是公共的,所以你不应该使用它们,即使你这样做了,你的代码也会充满反射垃圾,而且仅包含“正确”的操作系统的类被包含在JRE中,所以你仍然需要在代码中处理它们。

以下是Java 7版本的isAbsolute(...)实现,可供参考。注意,File.getPrefixLength()是包私有的。

Win32FileSystem

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

UnixFileSystem

public boolean isAbsolute(File f) 
{
        return (f.getPrefixLength() != 0);
}

12
请注意,这个答案已经过时了。现在,File类包含一个"isAbsolute()"方法,它正好做您预期的事情:_"测试此抽象路径名是否为绝对路径名。绝对路径名的定义因系统而异。在UNIX系统上,如果路径名的前缀为“/”,则该路径名是绝对的。在Microsoft Windows系统上,如果路径名的前缀是驱动器说明符后跟“\”,或者其前缀是“\\”,则该路径名是绝对的"_。 - Guus
1
不,这个答案并不过时,即使在JRE 11下,File#isAbsolute方法仍然取决于操作系统。在Unix操作系统上,new File(“C:\ Temp”).isAbsolute()将返回false,并在Windows上返回true。 - mlapeyre

7

在Java 7中:

new File(path).isAbsolute()

这取决于操作系统,不是 OP 需要的。https://docs.oracle.com/javase/7/docs/api/java/io/File.html#isAbsolute() - marcioggs

4

我采用Apache FilenameUtil来尝试解决这个问题 -

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

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


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

你复制了Java 7实现的public boolean isAbsolute(File f)方法用于Windows,但是你正在使用Apache Commons FilenameUtils.getPrefixLength()方法。Java 7实现和Apache实现的getPrefixLength()方法不同。对于UNC路径,Apache将返回"\foo\poo" -> "\foo"作为前缀,长度为6。 - acheron55
@Acheron55:我不明白你指的是哪个“isAbsolute()”?它在我的源代码片段中确切的位置在哪里? - stuhpa
请检查FilenameUtils.getPrefixLength(path)的源代码。对于UNC路径,它可能返回任意长度的数字。但是,在您的testPathWin方法中,您只检查长度为2或3。所以这是错误的。如果您可以使用它的Java实现,那么它将是正确的。因为它只返回0、1、2、3值。另外这一行:if (testPathWin(path, prefixLen) || testPathLinux(prefixLen)),由于Linux检查范围更广,将使您的Windows方法无用。假设您的长度为1,但是您的testPath方法仍将返回true,这是错误的。 - acheron55

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接