Как указать относительный путь к файлу в java
Перейти к содержимому

Как указать относительный путь к файлу в java

  • автор:

 

Interface Path

A Path represents a path that is hierarchical and composed of a sequence of directory and file name elements separated by a special separator or delimiter. A root component, that identifies a file system hierarchy, may also be present. The name element that is farthest from the root of the directory hierarchy is the name of a file or directory. The other name elements are directory names. A Path can represent a root, a root and a sequence of names, or simply one or more name elements. A Path is considered to be an empty path if it consists solely of one name element that is empty. Accessing a file using an empty path is equivalent to accessing the default directory of the file system. Path defines the getFileName , getParent , getRoot , and subpath methods to access the path components or a subsequence of its name elements.

In addition to accessing the components of a path, a Path also defines the resolve and resolveSibling methods to combine paths. The relativize method that can be used to construct a relative path between two paths. Paths can be compared , and tested against each other using the startsWith and endsWith methods.

This interface extends Watchable interface so that a directory located by a path can be registered with a WatchService and entries in the directory watched.

WARNING: This interface is only intended to be implemented by those developing custom file system implementations. Methods may be added to this interface in future releases.

Accessing Files

Paths may be used with the Files class to operate on files, directories, and other types of files. For example, suppose we want a BufferedReader to read text from a file » access.log «. The file is located in a directory » logs » relative to the current working directory and is UTF-8 encoded.

Interoperability

Paths associated with the default provider are generally interoperable with the java.io.File class. Paths created by other providers are unlikely to be interoperable with the abstract path names represented by java.io.File . The toPath method may be used to obtain a Path from the abstract path name represented by a java.io.File object. The resulting Path can be used to operate on the same file as the java.io.File object. In addition, the toFile method is useful to construct a File from the String representation of a Path .

Concurrency

Implementations of this interface are immutable and safe for use by multiple concurrent threads.

Relative Path in Java

Relative Path in Java

This tutorial introduces how to define a relative path in Java.

A relative path is an incomplete path (absence of root directory) and combined with the current directory path to access the resource file. The relative path doesn’t start with the root element of the file system.

We use the relative path to locate a file in the current directory or parent directory, or the same hierarchy.

There are several ways to define a relative path, such as ./ to refer to current directory path, ../ to immediate parent directory path, etc. Let’s see some examples.

Define a Relative Path to Locate File in Java

We can use the relative path to locate a file resource in the current working directory. See the example below.

Define Relative Path for Parent Directory in Java

We can use the ../ prefix with the file path to locate a file in the parent directory. This is the relative path for accessing a file in the parent directory. See the example below.

Define Relative Path in Current Directory in Java

If the file resource is located in the current directory, we can use the ./ prefix with the path to create a relative file path. See the example below.

Define Relative Path Using the ../../ Prefix in Java

If the file is located in two levels upper in the directory structure, use the ../../ prefix with the file path. See the below example.

Name already in use

java-cheatsheets / Path.md

  • Go to file T
  • Go to line L
  • Copy path
  • Copy permalink
  • Open with Desktop
  • View raw
  • Copy raw contents Copy raw contents

Copy raw contents

Copy raw contents

Представляет собой абстракцию пути к элементу файловой системы (файлу, каталогу или чему-то ещё). Понятие «файловой системы» здесь можно трактовать достаточно широко, и это не обязательно именно дисковая файловая система. Например, в стандартной библиотеке есть реализация, представляющая ZIP-архив как файловую систему.

Класс Path предназначен только для манипуляции путями как синтаксическими конструкциями, и вовсе не обязательно, что файл (или другой элемент ФС), на который указывает путь, действительно существует. Объект Path проще всего рассматривать как ссылку на элемент ФС, которая сама по себе не умеет работать с тем, на что ссылается. Для операций с самой ФС используется класс Files , принимающий параметры типа Path .

Здесь мы рассмотрим только операции со стандартной ФС.

Чтобы создать объект типа Path с нуля, используется статический метод get в классе Paths :

static Path get(String first, String. more)

Этот метод принимает один и более компонентов пути, разбивает их на отдельные подкомпоненты по платформозависимым разделителям ( / для Unix, \ для Windows), и из полученных компонентов создаёт объект типа Path .

Например, на платформе Windows все приведённые примеры эквивалентны:

Обратите внимание, что обратная косая черта должна экранироваться. К сожалению, в Java нет способа отменить экранирование для более короткой записи Windows-путей.

Объекты класса Path являются неизменяемыми. Все операции с путями возвращают новые объекты Path .

У класса Path есть вполне привычный метод toString() , возвращающий представление пути в виде строки, используя системный разделитель компонентов пути.

Абсолютные и относительные пути

Приведённый выше пример пути является абсолютным путём, потому что он начинается с корня ФС. Абсолютный путь всегда однозначно идентифицирует элемент ФС, независимо от того, какой каталог является текущим каталогом программы.

В Unix абсолютные пути начинаются с косой черты, обозначающей корень файловой системы, а в Windows — с буквы диска. Например, следующие два пути являются абсолютными:

Относительные пути — это пути, ведущие отсчёт от какого-то каталога. По умолчанию при выполнении операций ФС над относительными путями они разрешаются относительно текущего каталога (current directory), также называемого рабочим каталогом (working directory). Метод toAbsolutePath() позволяет преобразовать относительный путь в абсолютный, при этом он разрешается относительно текущего каталога.

Пусть в каталоге /home/user/java лежит файл AbsolutePath.class , откомпилированный из такого файла:

Тогда мы получим такой результат при запуске этой программы из командной строки (напомним, что команда cd устанавливает текущий каталог):

При задании относительных путей из соображений переносимости нежелательно использовать разделитель путей Windows \ , если только не известно точно, что программа будет запускаться только под Windows. Windows понимает разделитель путей Unix / , а вот обратное неверно. Ещё правильнее использовать статический метод Paths.get с несколькими параметрами, чтобы не завязываться на конкретный платформозависимый разделитель, а в случае необходимости всё-таки получить этот разделитель в виде строки можно воспользоваться методом FileSystem.getSeparator :

Для преобразования относительного пути в абсолютный относительно не текущего каталога, а какого-то другого, можно воспользоваться методом resolve . Его нужно вызвать у того пути, относительно которого мы разрешаем относительный путь. У метода resolve есть две версии: одна принимает Path , а вторая принимает String и рассматривает эту строку как путь, который предстоит разрешить.

Path resolve(Path other)

Path resolve(String other)

Обратную задачу решает метод relativize , превращающий переданный параметром абсолютный путь в относительный относительно того пути, у которого этот метод вызывается.

Path relativize(Path other)

 

Переход вверх и вниз по иерархии ФС

Метод getParent возвращает родительский элемент ФС (как правило, каталог), или null , если такового не существует.

А метод resolve можно использовать не только для абсолютизации путей, но и для получения пути к какому-либо элементу каталога или какого-то его подкаталога ещё ниже по иерархии ФС:

Есть также метод resolveSibling , позволяющий получить «сестринский» элемент ФС, то есть разрешающий переданный путь относительно родительского элемента ФС.

Path resolveSibling(Path other)

Path resolveSibling(String other)

Например, он позволяет получить путь к другому файлу в том же каталоге:

Доступ к компонентам пути

Методы getNameCount и getName позволяют пройтись по всем компонентам пути, представленного объектом Path . Эти компоненты сами имеют тип Path .

Path getName(int index)

Кроме того, класс Path реализует интерфейс Iterable<Path> и, следовательно, поддержку цикла for-each, поэтому то же самое делает и такой код:

Получение имени файла и каталога

Метод getFileName возвращает путь из одного компонента, соответствующего последнему компоненту исходного пути. Обычно это имя файла или другого элемента ФС, на который указывает объект Path . Обратите внимание, что этот метод возвращает Path , а не String .

Как мы знаем, получить путь к каталогу, в котором находится файл, можно с помощью getParent :

Работа с расширениями

К сожалению, класс Path сам по себе не предоставляет удобных способов работы с расширениями. В некотором смысле это логично, ведь понятие расширения существует только для приложений, работающих с файлами, а для самой ФС это всего лишь часть имени файла. Чтобы отделить расширение, придётся работать с именем файла как со строкой.

Прежде всего эту строку нужно получить:

После чего работать с расширениями можно обычными строковыми методами:

Обратите внимание на вызов toLowerCase . Это гарантирует, что мы проверим имя файла на нужное расширение в любом регистре ( .png , .PNG , .Png и т.д.).

У интерфейса Path тоже есть метод endsWith , но он проверяет, заканчивается ли путь данным компонентом пути, а не заканчивается ли строка имени файла данной строкой. Не путайте!

Наконец, можно написать свой метод, который возвращает расширение имени файла или пустую строку, если у имени файла нет расширения:

Взаимодействие со старыми API

Интерфейс Path появился в Java 7. Старые API, спроектированные для Java 6 и ниже, обычно используют вместо него более старый класс File , существовавший аж в Java 1.0. Он менее удобен, чем Path , потому что поддерживает только стандартную ФС и нарушает принцип единственности ответственности, сочетая в себе методы для синтаксической манипуляции путями и методы доступа к ФС.

Если нужно передать объект Path в старое API, используйте метод toFile :

И, получая объекты File из старого API, преобразуйте их в Path :

К примеру, класс ImageIO , отвечающий за загрузку, сохранение и преобразование изображений, к сожалению, так и не был обновлён для поддержки параметров типа Path . Вот так с помощью ImageIO можно преобразовать любой поддерживаемый формат изображений в формат PNG:

Знакомство с файлами

Если вы хотите написать программу, которая делает что-то с файлами на диске, это у вас очень легко получится. В Java очень много классов, которые помогают вам работать как с самими файлами, так и с их содержимым.

В ранних версиях Java для работы с файлами использовались классы типа File и FileInputStream . Но теперь класс File считается устаревшим, и использовать его не рекомендуется. Вы, конечно, можете еще встретить его в коде, параметрах методов или конструкторах классов.

Мы будем начинать изучение работы с файлами сразу с класса Path . Path — это класс, который пришел на смену File . Работа с ним безопаснее и эффективнее.

Класс Path

Технически Path — это не класс, а интерфейс. Так сделано для того, чтобы можно было под каждую операционную (и файловую) систему писать свой класс-наследник Path .

У Windows свои стандарты написания пути файлов, у Linux — свои. А ведь в мире еще много операционных систем, и у каждой — свои стандарты.

Поэтому везде в методах для работы с файлами указан интерфейс Path , а реально работа идет с его классами-наследниками: WindowsPath , UnixPath , .

Создание объекта Path

Чтобы создать объект Path (на самом деле это будет объект класса-наследника — WindowsPath ), нужно воспользоваться командой вида:

Где имя — это имя переменной типа Path . путь — это путь к файлу (или директории) вместе с именем файла (или директории). А of — статический метод класса Path .

Метод of() используется для того, чтобы создать объекты типа WindowsPath если программа запускается под Windows, а если программа запускается под Linux — объекты UnixPath . Вы не можете создать объект типа Path с помощью кода вида new Path() .

Код Примечание
Путь к файлу
Путь к директории

Файл (или директория) не обязаны существовать, чтобы мог существовать валидный объект типа Path . Может вы только хотите создать файл. Объект типа Path — это как продвинутая версия типа String — он не привязан к конкретному файлу на диске: он просто хранит некий путь на диске и все.

2. Методы типа Path

У интерфейса Path есть довольно много интересных методов. Самые интересные представлены в таблице ниже.

Метод Описание
Возвращает родительскую директорию
Возвращает имя файла без директории
Возвращает корневую директорию из пути
Проверяет, что текущий путь — абсолютный
Преобразует путь в абсолютный
Убирает шаблоны в имени директории.
Строит новый абсолютный путь из абсолютного и относительного.
Получает относительный путь из двух абсолютных путей.
Проверяет, что текущий путь начинается с пути
Проверяет, что текущий путь заканчивается на путь
Дробит путь на части с помощью разделителя / .
Возвращает количество частей.
Дробит путь на части с помощью разделителя / .
Возвращает часть по ее номеру.
Дробит путь на части с помощью разделителя / .
Возвращает часть пути, заданную интервалом.
Преобразует объект Path в устаревший объект File
Преобразует объект Path в объект типа URI

Ниже идет краткое описание существующих методов.

3. Разделение пути на части

Метод getParent() возвращает путь, который указывает на родительскую директорию для текущего пути. Независимо от того, был этот путь директорией или файлом:

Код Значение

Метод getFileName() возвращает одно имя файла (или директории) — то, что идет после последнего разделителя:

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *