Джава:Как узнать, является ли путь абсолютным независимо от ОС

StackOverflow https://stackoverflow.com/questions/1025285

  •  06-07-2019
  •  | 
  •  

Вопрос

Есть ли способ в 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, для решения этой проблемы.Или у кого-нибудь когда-нибудь возникала такая проблема?И как вы это решили?

Спасибо!

Это было полезно?

Решение

Неа.

Есть некоторые основополагающие Файловая система классы (это 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);
}

Другие советы

В Java 7:

new File(path).isAbsolute()

Моя попытка сделать это с помощью Apache FilenameUtil –

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

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

В итоге я использовал это (в 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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top