Spec-Zone .ru
спецификации, руководства, описания, API
|
Path
class включает различные методы, которые могут использоваться, чтобы получить информацию о пути, элементах доступа пути, преобразовать путь к другим формам, или извлекать части пути. Есть также методы для того, чтобы соответствовать строку пути и методы для того, чтобы удалить избыточность в пути. Этот урок адресует их Path
методы, иногда называемые синтаксическими операциями, потому что они работают на пути непосредственно и не получают доступ к файловой системе.
Этот раздел покрывает следующее:
A Path
экземпляр содержит информацию, используемую, чтобы определить расположение файла или каталога. В то время, когда это определяется, a Path
предоставляется серию одного или более имен. Корневой элемент или имя файла могли бы быть включены, но ни один не требуется. A Path
мог бы состоять из только единственного каталога или имени файла.
Можно легко создать a Path
объект при использовании одного из следующих get
методы от Paths
Path p1 = Paths.get("/tmp/foo"); Path p2 = Paths.get(args[0]); Path p3 = Paths.get(URI.create("file:///Users/joe/FileTest.java"));
Paths.get
метод является сокращением для следующего кода:
Path p4 = FileSystems.getDefault().getPath("/users/sally");
Следующий пример создает /u/joe/logs/foo.log
принятие Вашего корневого каталога /u/joe
, или C:\joe\logs\foo.log
если Вы находитесь на Windows.
Path p5 = Paths.get(System.getProperty("user.home"),"logs", "foo.log");
Можно думать Path
как хранящий эти элементы имени как последовательность. Самый высокий элемент в структуре каталогов был бы расположен в, индексируют 0. Самый низкий элемент в структуре каталогов был бы расположен в, индексируют [n-1]
, где n
число элементов имени в Path
. Методы доступны для получения отдельных элементов или подпоследовательности Path
использование их индексирует.
Примеры в этом уроке используют следующую структуру каталогов.
Следующий фрагмент кода определяет a Path
экземпляр и затем вызывает несколько методов, чтобы получить информацию о пути:
// None of these methods requires that the file corresponding // to the Path exists. // Microsoft Windows syntax Path path = Paths.get("C:\\home\\joe\\foo"); // Solaris syntax Path path = Paths.get("/home/joe/foo"); System.out.format("toString: %s%n", path.toString()); System.out.format("getFileName: %s%n", path.getFileName()); System.out.format("getName(0): %s%n", path.getName(0)); System.out.format("getNameCount: %d%n", path.getNameCount()); System.out.format("subpath(0,2): %s%n", path.subpath(0,2)); System.out.format("getParent: %s%n", path.getParent()); System.out.format("getRoot: %s%n", path.getRoot());
Вот вывод и для Windows и для Соляриса ОС:
Вызванный метод | Возвраты в Солярисе ОС | Возвраты в Microsoft Windows | Комментарий |
---|---|---|---|
toString |
/home/joe/foo |
C:\home\joe\foo |
Возвращает строковое представление Path . Если путь создавался, используя Filesystems.getDefault().getPath(String) или Paths.get (последний является методом удобства для getPath ), метод выполняет незначительную синтаксическую уборку. Например, в операционной системе UNIX, это исправит строку ввода //home/joe/foo к /home/joe/foo . |
getFileName |
foo |
foo |
Возвращает имя файла или последний элемент последовательности элементов имени. |
getName(0) |
home |
home |
Возвращается элемент пути, соответствующий указанному, индексируют. 0th элемент является элементом пути, самым близким к корню. |
getNameCount |
3 |
3 |
Возвращает число элементов в пути. |
subpath(0,2) |
home/joe |
home\joe |
Возвращает подпоследовательность Path (не включая корневой элемент), как определено к началу и окончанию индексирует. |
getParent |
/home/joe |
\home\joe |
Возвращает путь родительского каталога. |
getRoot |
/ |
C:\ |
Возвращает корень пути. |
Предыдущий пример показывает вывод для абсолютного пути. В следующем примере определяется относительный путь:
// Solaris syntax Path path = Paths.get("sally/bar"); or // Microsoft Windows syntax Path path = Paths.get("sally\\bar");
Вот является вывод для Windows и Соляриса ОС:
Вызванный метод | Возвраты в Солярисе ОС | Возвраты в Microsoft Windows |
---|---|---|
toString |
sally/bar |
sally\bar |
getFileName |
bar |
bar |
getName(0) |
sally |
sally |
getNameCount |
2 |
2 |
subpath(0,1) |
sally |
sally |
getParent |
sally |
sally |
getRoot |
null |
null |
Много файловых систем используют "." нотацию, чтобы обозначить текущий каталог и ".." обозначить родительский каталог. У Вас могла бы быть ситуация где a Path
содержит избыточную информацию о каталоге. Возможно, сервер конфигурируется, чтобы сохранить его файлы журнала в"/dir/logs/.
"каталог, и Вы хотите удалить запаздывание"/.
"нотация от пути.
Следующие примеры оба включают избыточность:
/home/./joe/foo /home/sally/../joe/foo
normalize
метод удаляет любые избыточные элементы, который включает любого".
"или"directory/..
"возникновения. Оба из предыдущих примеров нормализуют к /home/joe/foo
.
Важно отметить это normalize
не проверяет в файловой системе, когда она очищает путь. Это - просто синтаксическая работа. Во втором примере, если sally
была символьная ссылка, удаляя sally/..
мог бы привести к a Path
это больше не определяет местоположение намеченного файла.
Чтобы очистить путь, гарантируя, что результат определяет местоположение корректного файла, можно использовать toRealPath
метод. Этот метод описывается в следующем разделе,
Можно использовать три метода, чтобы преобразовать Path
. Если Вы должны преобразовать путь к строке, которая может быть открыта от браузера, можно использовать toUri
. Например:
Path p1 = Paths.get("/home/logfile"); // Result is file:///home/logfile System.out.format("%s%n", p1.toUri());
toAbsolutePath
Path
объект. toAbsolutePath
метод может быть очень полезным, обрабатывая вводимые пользователем имена файлов. Например:
public class FileTest { public static void main(String[] args) { if (args.length < 1) { System.out.println("usage: FileTest file"); System.exit(-1); } // Converts the input string to a Path object. Path inputPath = Paths.get(args[0]); // Converts the input Path // to an absolute path. // Generally, this means prepending // the current working // directory. If this example // were called like this: // java FileTest foo // the getRoot and getParent methods // would return null // on the original "inputPath" // instance. Invoking getRoot and // getParent on the "fullPath" // instance returns expected values. Path fullPath = inputPath.toAbsolutePath(); } }
toAbsolutePath
метод преобразовывает ввод данных пользователем и возвращает a Path
это возвращает полезные значения когда запрошено. Файл не должен существовать для этого метода, чтобы работать.
toRealPath
true
передается к этому методу, и файловая система поддерживает символьные ссылки, этот метод разрешает любые символьные ссылки в пути.Path
относительно, это возвращает абсолютный путь.Path
содержит любые избыточные элементы, это возвращает путь с теми удаленными элементами.Этот метод выдает исключение, если файл не существует или не может быть получен доступ. Можно поймать исключение, когда Вы хотите обработать любой из этих случаев. Например:
try { Path fp = path.toRealPath(true); } catch (NoSuchFileException x) { System.err.format("%s: no such" + " file or directory%n", path); // Logic for case when file doesn't exist. } catch (IOException x) { System.err.format("%s%n", x); // Logic for other sort of file error. }
Можно объединить пути при использовании resolve
метод. Вы передаете в частичном пути, который является путем, который не включает корневой элемент, и что частичный путь добавляется к исходному пути.
Например, рассмотрите следующий фрагмент кода:
// Solaris Path p1 = Paths.get("/home/joe/foo"); // Result is /home/joe/foo/bar System.out.format("%s%n", p1.resolve("bar")); or // Microsoft Windows Path p1 = Paths.get("C:\\home\\joe\\foo"); // Result is C:\home\joe\foo\bar System.out.format("%s%n", p1.resolve("bar"));
Передача абсолютного пути к resolve
метод возвращает переданный - в пути:
// Result is /home/joe Paths.get("foo").resolve("/home/joe");
Общее требование, когда Вы пишете код файлового ввода-вывода, является возможностью создать путь из одного расположения в файловой системе к другому расположению. Можно встретить это использование relativize
метод. Этот метод создает путь, происходящий из исходного пути и заканчивающийся в расположении, определенном переданным - в пути. Новый путь относительно исходного пути.
Например, считайте два относительных пути определенными как joe
и sally
:
Path p1 = Paths.get("joe"); Path p2 = Paths.get("sally");
В отсутствие любой другой информации это принимается это joe
и sally
одноуровневые элементы, означая узлы, которые находятся на том же самом уровне в древовидной структуре. Перемещаться от joe
к sally
, Вы ожидали бы сначала перемещаться по одному уровню до родительского узла и затем вниз к sally
:
// Result is ../sally Path p1_to_p2 = p1.relativize(p2); // Result is ../joe Path p2_to_p1 = p2.relativize(p1);
Рассмотрите немного более сложный пример:
Path p1 = Paths.get("home"); Path p3 = Paths.get("home/sally/bar"); // Result is sally/bar Path p1_to_p3 = p1.relativize(p3); // Result is ../.. Path p3_to_p1 = p3.relativize(p1);
В этом примере эти два пути совместно используют тот же самый узел, home
. Перемещаться от home
к bar
, Вы сначала перемещаетесь, каждый уравнивает к sally
и затем еще один уравнивать к bar
. Навигация от bar
к home
требует перемещающийся вверх два уровня.
Относительный путь не может быть создан, если только один из путей включает корневой элемент. Если оба пути включают корневой элемент, возможность создать относительный путь системно-зависима.
Рекурсивное
пример использует Copy
relativize
и resolve
методы.
Path
class поддерживает equals
, то, чтобы позволять Вам протестировать два пути на равенство. startsWith
endsWith
Path path = ...; Path otherPath = ...; Path beginning = Paths.get("/home"); Path ending = Paths.get("foo"); if (path.equals(otherPath)) { // equality logic here } else if (path.startsWith(beginning)) { // path begins with "/home" } else if (path.endsWith(ending)) { // path ends with "foo" }
Path
class реализует Iterable
iterator
Path path = ...; for (Path name: path) { System.out.println(name); }
Path
class также реализует Comparable
Path
объекты при использовании compareTo
который полезен для сортировки.
Можно также поместить Path
объекты в a Collection
. См., что
Когда Вы хотите проверить это два Path
объекты определяют местоположение того же самого файла, можно использовать isSameFile
метод, как описано в Проверке, определяют Ли Два Пути Местоположение Того же самого Файла.