2009-06-22 2 views
16

Есть ли в 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

на Linux, путь, как "C:/Мои документы", вероятно, недействительным, и это, безусловно, не является абсолютным. В системах, реализующих стандарт posix, все пути существуют ниже одного «корня», и, таким образом, абсолютный путь начинается с этого корня. Таким образом, абсолютный путь всегда начинается с «/». все остальное воспринимается относительно текущего рабочего каталога процесса. В linux «C:/...» понимается каталог внутри текущего рабочего каталога, который называется «C:», что, скорее всего, бессмысленно. – SingleNegationElimination

+1

Ваш вопрос не имеет смысла. Представьте гипотетическую операционную систему, где все пути являются абсолютными. Допустим, в этой операционной системе есть Java. Таким образом, для удовлетворения вашего требования вам нужен метод isFileAbsolute(), который всегда возвращает true, независимо от платформы, в которой в данный момент запущена программа. Легко реализовать, но бессмысленно. –

+0

У меня возникла ситуация, когда пользователь настраивает рабочий каталог на удаленном компьютере. Удаленный компьютер может работать с Unix или Windows (хотя наиболее распространенным сценарием является локальная машина - это окна, а удаленная машина - unix). Указанный пользователем путь должен быть проверен, и требуется определить, является ли путь абсолютным. –

ответ

10

Nope.

Есть некоторые основные 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); 
} 
+9

Обратите внимание, что после шести лет этот ответ устарел. В настоящее время класс File содержит метод «[isAbsolute()] (http://docs.oracle.com/javase/7/Acta), который делает именно то, d ожидать: _ «Проверяет, является ли этот абстрактный путь абсолютным. Определение абсолютного пути является системным. В системах UNIX путь является абсолютным, если его префикс«/». В системах Microsoft Windows путь является абсолютным, если его префикс является спецификатором диска, за которым следует «\\», или если его префикс «\\\\» _ – Guus

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

Вы скопировали реализацию Java 7 public boolean isAbsolute (File f) для Windows, но вы используете apache commons Метод FilenameUtils.getPrefixLength() Реализация Java 7 и реализация Apache getPrefixLength() не совпадают. Для путей UNC apache вернет «\\ foo \ poo» -> «\\ foo \» в качестве префикса, а длина будет 6 – acheron55

+0

@ Acheron55: 't понять, к какому "isAbsolute()" вы ссылаетесь? Где это точно в моем исходном фрагменте? – stuhpa

+0

check t он исходный код FilenameUtils.getPrefixLength (путь). Он может возвращать любое количество длин для UNC-путей. Но вы проверяете только длину 2 или 3 в методе testPathWin. Так что это неправильно. Было бы правдой, если бы вы могли использовать java-реализацию. Потому что он возвращает только 0,1,2,3 значения. Также эта строка: 'if (testPathWin (путь, префиксLen) || testPathLinux (prefixLen))' linux check сделает ваш метод Windows бесполезным, так как он имеет гораздо более широкий диапазон. Скажем, ваша длина равна 1 для пути к окну, но ваш метод testPath все равно вернет true, что неверно – acheron55

3

Моя трещина в этом с помощью Apache FilenameUtil -

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

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