Изучите разницу между путем, абсолютным и каноническим путями. Также научитесь получать путь к файлу в Java с помощью стандартных классов IO и New IO.
1. Относительные, абсолютные и канонические пути
1.1 Относительный путь
Относительный путь — это путь, описывающий местоположение файла или папки относительно текущего рабочего каталога. В отличие от абсолютных путей, относительные пути содержат информацию, которая относится только к текущему каталогу.
Это путь, который мы обычно указываем в конструкторе класса File.
src\main\java\com\howtodoinjava\io\foo\foo.txtsrc\main\java\com\howtodoinjava\io\foo\bar\bar.txt
1.2 Абсолютный Путь
Абсолютный путь всегда содержит корневой элемент и полную иерархию каталогов, необходимую для поиска файла. Для доступа к файлу или пути больше не требуется никакой информации.
- Абсолютные пути содержат всю необходимую информацию для поиска ресурсов, указанных в абсолютном URL-адресе.
- Абсолютные пути могут содержать сокращения, такие как одинарные и двойные точки в путях к файлам.
C:\Users\lokesh\IdeaProjects\Core-Java\src\main\java\com\howtodoinjava\io\foo\foo.txtC:\Users\lokesh\IdeaProjects\Core-Java\src\main\java\com\howtodoinjava\io\foo\bar\..\foo.txt
1.3 Канонический путь
Канонические пути — это абсолютные пути после разрешения сокращений или избыточных имен, таких как точки «.» и «..» в соответствии со структурой каталогов.
Канонический путь к файлу просто «очищает» путь до абсолютного пути, удаляя и разрешая такие вещи, как точки и разрешая символические ссылки(в UNIX).
C:\Users\lokesh\IdeaProjects\Core-Java\src\main\java\com\howtodoinjava\io\foo\foo.txtC:\Users\lokesh\IdeaProjects\Core-Java\src\main\java\com\howtodoinjava\io\foo\bar\bar.txt
2. Получить пути к файлам с помощью java.io.File
Класс java.io.File имеет три метода для получения путей файловой системы:
- file.getPath() : возвращает ту же строку, что была передана в качестве конструктора File.
- file.getAbsolutePath() : возвращает путь к файлу после разрешения пути для текущего каталога пользователя. Он не разрешает сокращения, такие как одинарные и двойные точки.
- file.getCanonicalPath() : возвращает полный путь после разрешения абсолютного пути, а также сокращений.
File file = new File("src/main/java/com/howtodoinjava/io/foo/bar/../foo.txt");String givenPath = file.getPath();String absPath = file.getAbsolutePath();String canPath = file.getCanonicalPath();System.out.println(givenPath);System.out.println(absPath);System.out.println(canPath);
src\main\java\com\howtodoinjava\io\foo\bar\..\foo.txtC:\Users\lokes\IdeaProjects\Core-Java\src\main\java\com\howtodoinjava\io\foo\bar\..\foo.txtC:\Users\lokes\IdeaProjects\Core-Java\src\main\java\com\howtodoinjava\io\foo\foo.txt
3. Получите пути к файлам с помощью java.nio.file.Path
Java.nio.file.Path также предоставляет следующие методы для получения различных путей:
- path.toAbsolutePath() – полный путь к файлу, аналогичный file.getAbsolutePath().
- path.toRealPath() – Канонический путь, аналогичный file.getCanonicalPath().
Методы Path выдают исключение NoSuchFileException, если файл отсутствует в указанном месте. Методы File не выдают никаких исключений.
Path path = Path.of("src/main/java/com/howtodoinjava/io/foo/bar/../foo.txt");givenPath = path.toString();absPath = path.toAbsolutePath().toString();canPath = path.toRealPath().toString();System.out.println(givenPath);System.out.println(absPath);System.out.println(canPath);
src\main\java\com\howtodoinjava\io\foo\bar\..\foo.txtC:\Users\lokes\IdeaProjects\Core-Java\src\main\java\com\howtodoinjava\io\foo\bar\..\foo.txtC:\Users\lokes\IdeaProjects\Core-Java\src\main\java\com\howtodoinjava\io\foo\foo.txt
4. Заключение
В этом уроке мы рассмотрели различные типы путей файловой системы в Java и способы получения этих путей с помощью API Java.
Лучше всего всегда использовать канонические пути, если мы не уверены, содержит ли указанный путь сокращенные символы или нет.