Java: Как узнать, является ли путь абсолютным независимо от ОС - PullRequest
16 голосов
/ 22 июня 2009

В любом случае в 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 ]

10 голосов
/ 22 июня 2009

Нет.

Существуют некоторые базовые 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);
}
8 голосов
/ 24 апреля 2015

В Java 7:

new File(path).isAbsolute()
3 голосов
/ 30 июля 2014

Мой кряк при использовании Apache FilenameUtil -

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

Технически это возвращается! Относительный. Что хорошо для моих целей.

0 голосов
/ 11 сентября 2013

Я использовал это (в 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);
}
...