Джава:Как узнать, является ли путь абсолютным независимо от ОС
-
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() является частным для пакета.
public boolean isAbsolute(File f)
{
int pl = f.getPrefixLength();
return (((pl == 2) && (f.getPath().charAt(0) == slash))
|| (pl == 3));
}
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);
}