Вступление
Последние несколько выпусков Java, а именно Java 7, Java 8 и грядущая Java 9, имеют довольно много функций, которые облегчают жизнь Java-разработчикам. (Я знаю, что Java 9 сделает его более жестким, но только когда вы примете новую парадигму. После этого она станет намного лучше).
Одной из функций или API были усовершенствования Файлового API, представленные в Java 7. Одним из новых классов этого набора функций является java.nio.file.Path и его фабрика java.nio.file.Paths .
Maven Зависимости
Мы будем использовать JUnit и AssertJ для написания наших тестов для демонстрации API.
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
12 
 | 
<dependency>    <groupId>junit</groupId>    <artifactId>junit</artifactId>    <version>4.12</version></dependency><dependency>    <groupId>org.assertj</groupId>    <artifactId>assertj-core</artifactId>    <!-- use 2.8.0 for Java 7 projects -->    <version>3.8.0</version>    <scope>test</scope></dependency> | 
Создание экземпляра java.nio.file.Path
Как я упоминал ранее, java.nio.file.Paths является создателем java.nio.file.Path, то есть предоставляет два фабричных метода:
- статический путь get (String first, String… more)
 - статический путь получения (URI URI )
 
это может быть использовано для получения экземпляра java.nio.file.Path . Давайте посмотрим на два способа получить экземпляр:
| 
 01 
02 
03 
04 
05 
06 
07 
08 
09 
10 
11 
 | 
@Testpublic void testPathCreation(){    Path path = Paths.get("src", "main", "resources");    assertThat(path.isAbsolute()).isFalse();    assertThat(path.toString()).isEqualTo("src\\main\\resources");    Path uriPath = Paths.get(URI.create("file:///Users/Mohamed/git"));    assertThat(uriPath.isAbsolute()).isFalse();    assertThat(uriPath.toAbsolutePath().toString())            .isEqualTo("C:\\Users\\Mohamed\\git");} | 
Изучение API
Используя конец с ()
Этот метод используется для проверки, заканчивается ли данный объект Path другим объектом Path или путем, представленным в виде объекта String .
| 
 1 
2 
3 
4 
5 
6 
 | 
@Testpublic void testEndsWith(){    Path path = Paths.get("src", "main", "resources");    assertThat(path.endsWith(Paths.get("main","resources"))).isTrue();    assertThat(path.endsWith("resources")).isTrue();} | 
Использование getFileName ()
Этот метод возвращает имя каталога или файла, присутствующего в терминале или в конце пути.
| 
 1 
2 
3 
4 
5 
6 
7 
8 
9 
 | 
@Testpublic void testGetFileName(){    Path path = Paths.get("src", "main", "resources");    assertThat(path.getFileName().toString()).isEqualTo("resources");    path = Paths.get("src", "test", "java", "info",         "sanaulla","PathDemoTest.java");    assertThat(path.getFileName().toString())        .isEqualTo("PathDemoTest.java");} | 
Использование getFileSystem ()
Этот метод возвращает экземпляр java.nio.file.FileSystem, представляющий базовую файловую систему. Мы рассмотрим это подробно в следующем посте.
| 
 1 
2 
3 
4 
5 
6 
7 
 | 
@Testpublic void testGetFileSystem(){    Path path = Paths.get("src", "main", "resources");    assertThat(path.getFileSystem()).isNotNull();    assertThat(path.getFileSystem().getSeparator()).isEqualTo("\\");    path.getFileSystem().getRootDirectories().forEach(System.out::println);} | 
Использование getName () и getNameCount ()
GetNameCount () возвращает количество компонентов имени, присутствующих в пути, где каждый компонент имени отделяется разделителем файлов. И метод getName () берет индекс и возвращает компонент имени в индексе.
Например, указанный путь: /var/log/myapp/spring.log имеет 4 компонента имени, а позиция компонента равна 0. Таким образом, компонент имени в индексе 1 является log.
| 
 1 
2 
3 
4 
5 
6 
7 
8 
 | 
@Testpublic void testGetName(){    Path path = Paths.get("src", "main", "resources");    assertThat(path.getName(0)).isEqualTo(Paths.get("src"));    assertThat(path.getName(path.getNameCount() - 1))            .isEqualTo(Paths.get("resources"));} | 
Использование getParent ()
Этот API возвращает путь от корня пути до конечного каталога или файла (т.е. исключая его). Например: вызов getParent () для экземпляра Path, представляющего /var/log/myapp/spring.log, возвращает экземпляр Path, представляющий / var / log / myapp
Он возвращает ноль, если данный путь не имеет родителя или является корневым каталогом.
| 
 1 
2 
3 
4 
5 
6 
 | 
@Testpublic void testGetParent(){    Path path = Paths.get("src", "main", "resources");    assertThat(path.getParent()).isEqualTo(Paths.get("src", "main"));    assertThat(Paths.get("/").getParent()).isNull();} | 
Использование getRoot ()
Этот API возвращает экземпляр Path для корня, если он существует, или NULL для данного экземпляра Path .
| 
 1 
2 
3 
4 
5 
6 
7 
8 
 | 
@Testpublic void testGetRoot(){    Path path = Paths.get("src", "main", "resources");    assertThat(path.getRoot()).isNull();    path = Paths.get("/users", "Mohamed", "git", "blogsamples");    assertThat(path.getRoot()).isEqualTo(Paths.get("/"));} | 
Использование normalize ()
Этот API немного хитрый. Это удаляет лишние элементы на вашем пути. Избыточные элементы — это те, удаление которых в конечном итоге приведет к аналогичному Пути . Например: если у нас есть путь, src \ .. \ src \ main \ java эквивалентен src \ main \ java . API normalize () помогает в достижении последнего из первого.
| 
 1 
2 
3 
4 
5 
6 
7 
8 
 | 
@Testpublic void testNormalize(){    Path path = Paths.get("src","..", "src", "main", "resources", ".");    assertThat(path.toString())            .isEqualTo("src\\..\\src\\main\\resources\\.");    assertThat(path.normalize().toString())            .isEqualTo("src\\main\\resources");} | 
Использование subpath ()
Этот метод возвращает подпуть, идентифицируемый нижней границей и верхней границей, которые передаются методу в качестве параметров. Верхняя граница исключается при вычислении подпути.
| 
 1 
2 
3 
4 
5 
6 
7 
8 
 | 
@Testpublic void testSubpath(){    Path path = Paths.get("Mohamed", "git",             "blogsamples", "src", "main", "resources");    assertThat(path.subpath(2, 3).toString()).isEqualTo("blogsamples");    assertThat(path.subpath(0, path.getNameCount()).toString())            .isEqualTo("Mohamed\\git\\blogsamples\\src\\main\\resources");} | 
Использование toAbsolutePath ()
Этот метод возвращает абсолютный путь для данного пути. Абсолютный путь начинается с корня файловой системы.
| 
 1 
2 
3 
4 
5 
6 
 | 
@Testpublic void testToAbsolutePath(){    Path path = Paths.get("src", "main", "resources");    assertThat(path.toAbsolutePath().toString())       .isEqualTo("C:\\Users\\Mohamed\\git\\blogsamples\\src\\main\\resources");} | 
Использование toFile ()
Это очень удобный способ создания экземпляра java.io.File . Мы можем использовать создание объекта Path с несколькими уровнями папок, а затем использовать toFile () для получения экземпляра File .
| 
 1 
2 
3 
4 
5 
6 
7 
8 
 | 
@Testpublic void testToFile(){    Path path = Paths.get("src", "main", "resources");    File file = path.toFile();    assertThat(file).isNotNull();    assertThat(file.isDirectory()).isTrue();    assertThat(file.exists()).isTrue();} | 
Использование toRealPath ()
Этот метод может использоваться для разрешения символической ссылки на ее реальное местоположение. Чтобы протестировать этот API, мы создаем символическую ссылку:
На окнах вы бы использовали:
| 
 1 
 | 
mklink /D "C:\blogsample" "C:\Users\Mohamed\git\blogsamples" | 
В Linux вы бы использовали
| 
 1 
 | 
ln -s /var/log/sample.log sample | 
Метод принимает опцию типа LinkOption . На данный момент это перечисление имеет один элемент, т.е. NOFOLLOW_LINKS . Если эта опция пропущена, символическая ссылка не преобразуется в ее реальный путь.
| 
 1 
2 
3 
4 
5 
6 
7 
8 
 | 
@Testpublic void testToRealPath() throws IOException {    Path path = Paths.get( "/blogsample");    assertThat(path.toRealPath().toString())            .isEqualTo("C:\\Users\\Mohamed\\git\\blogsamples");    assertThat(path.toRealPath(LinkOption.NOFOLLOW_LINKS).toString())            .isEqualTo("C:\\blogsample");} | 
Использование toUri ()
Этот метод возвращает представление URI данного пути. Обычно в Windows вы видите что-то вроде: file: /// C: / . Но это зависит от системы
| 
 1 
2 
3 
4 
5 
6 
 | 
@Testpublic void testToUri(){    Path path = Paths.get("src", "main", "resources");    assertThat(path.toUri()).isEqualTo(      URI.create("file:///C:/Users/Mohamed/git/blogsamples/src/main/resources/"));} | 
Примечание . Важно отметить, что тип возвращаемого значения большинства API является экземпляром java.nio.file.Path. Это помогает нам объединять несколько методов и вызывать их для одного экземпляра java.nio.file.Path.
В следующей статье мы рассмотрим оставшиеся несколько API в java.nio.file.Path .
| Ссылка: | Знакомство с java.nio.file.Path — 1 от нашего партнера по JCG Мохамеда Санауллы в блоге Experiences Unlimited . |