Java: как узнать, является ли путь абсолютным независимо от ОС
Есть ли в 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
Неа.
Существуют некоторые базовые классы 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);
}
Ответ 2
В Java 7:
new File(path).isAbsolute()
Ответ 3
Моя трещина при использовании Apache FilenameUtil -
public static boolean isAbsolute(final String path) {
return FilenameUtils.getPrefixLength(path) != 0;
}
Технически это возвращается! относительный. Это хорошо для моих целей.
Ответ 4
В итоге я использовал это (в 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);
}