Статьи

Знакомство с java.nio.file.Path — 1

Вступление

Последние несколько выпусков 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
@Test
public 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
@Test
public 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
@Test
public 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
@Test
public 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
@Test
public 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
@Test
public 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
@Test
public 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
@Test
public 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
@Test
public 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
@Test
public 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
@Test
public 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
@Test
public 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
@Test
public 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 .