Статьи

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

В первой части мы рассмотрели большинство API в классе java.nio.file.Path . В этой статье мы рассмотрим остальные API.

Использование register ()

Этот API позволяет нам регистрировать реализацию интерфейса java.nio.file.WatchService, который будет прослушивать такие события, как создание, изменение и удаление каталога. И это намекает на слушателей с помощью java.nio.file.WatchKey. Я хотел бы посвятить другую статью этому API, потому что она включает в себя еще одну новую функцию, которая была представлена ​​в Java 7.

Использование resol ()

Этот метод имеет дело с двумя экземплярами Path . В этом случае вызывается один экземпляр метода resol (), а другой — в качестве аргумента. Аргументом может быть либо экземпляр Path, либо строка, представляющая путь.

Этот метод разрешает другой путь против этого пути. Решение сделано следующим образом:

  1. Если другой путь является абсолютным, он возвращает другой путь. Потому что другой путь может быть достигнут с помощью абсолютного пути.
  2. Если другой путь является относительным путем, то другой путь добавляется к этому пути. Например:
    1
    2
    3
    4
    5
    Path path = Paths.get("src", "main", "resources");
    Path other = Paths.get("blogsamples");
     
    assertThat(path.resolve(other)).isEqualTo(
            Paths.get("src", "main", "resources", "blogsamples"));

Различные сценарии, в которых этот метод может быть вызван, приведены в тесте ниже:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
@Test
public void testResolved() throws IOException {
    Path path = Paths.get("src", "main", "resources");
    Path other = Paths.get("blogsamples");
 
    assertThat(path.resolve(other)).isEqualTo(
            Paths.get("src", "main", "resources", "blogsamples"));
 
    other = Paths.get("/Users");
    assertThat(path.resolve(other)).isEqualTo(Paths.get("/Users"));
 
    path = Paths.get("/src", "main", "resource");
    assertThat(path.resolve("/Users")).isEqualTo(Paths.get("/Users"));
}

Использование resolSibling ()

Этот метод похож на resol () за исключением того, что он учитывает родительский путь для разрешения другого пути. Опять же, есть разные возможности, которые я уловил в тесте ниже:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Test
public void testResolveSibling(){
    Path path = Paths.get("src", "main", "resources", "test1");
    Path other = Paths.get("test2");
 
    //both paths are not absolute
    assertThat(path.resolveSibling(other)).isEqualTo(
            Paths.get("src", "main", "resources", "test2"));
 
    //other path is absolute
    assertThat(path.resolveSibling("/test2")).isEqualTo(
        Paths.get("/test2"));
 
    //this path has no parent
    path = Paths.get("/");
    assertThat(path.resolveSibling("/test2")).isEqualTo(
        Paths.get("/test2"));
 
    //the other path is empty and this path has no parent
    assertThat(path.resolveSibling("")).isEqualTo(Paths.get(""));
 
    //the other path is empty and this path has parent
    path = Paths.get("src", "main", "resources", "test1");
    assertThat(path.resolveSibling("")).isEqualTo(
            Paths.get("src", "main", "resources"));
}

Использование релятивизировать ()

Этот метод возвращает относительный путь, который при разрешении по этому пути возвращает другой путь (т. Е. Путь, который передается в качестве параметра).

Я попытался проиллюстрировать в тестах ниже различные возможности, пытаясь создать относительный путь между двумя путями.

1
2
3
4
5
Path path = Paths.get("src", "main", "resources", "test1");
Path other = Paths.get("test2");
 
assertThat(path.relativize(other).toString())
    .isEqualTo("..\\..\\..\\..\\test2");

В приведенном выше случае оба пути являются относительными. Для достижения / test2 требуется 4 прыжка назад от src / main / resources / test1. То же самое можно получить, применив метод релятивизации.

Если один из путей является абсолютным, а другой — относительным, то вызов релятивизации приводит к исключению IllegalArgumentException, как показано ниже:

1
2
3
4
5
6
@Test(expected = IllegalArgumentException.class)
public void testRelativize_WithRelativeAndAbsolutePath(){
    Path path = Paths.get("/src", "main", "resources", "test1");
    Path other = Paths.get("src", "main", "resources");
    path.relativize(other);
}

Если оба пути являются абсолютными, то результат релятивизации () зависит от реализации. Приведенный ниже тест написан для JDK 8 на платформе Windows:

1
2
3
4
5
6
7
@Test
public void testRelativize_WithAbsolutePaths(){
    Path path = Paths.get("/src", "main", "resources", "test1");
    Path other = Paths.get("/src", "main", "resources", "test1", "test2");
    assertThat(path.relativize(other).toString())
        .isEqualTo("test2");
}

Использование startWith ()

Этот метод проверяет, имеет ли путь, по которому метод startWith () в начале, те же элементы имени, что и путь, переданный в качестве аргумента. И путь, переданный в качестве аргумента, не имеет дополнительных элементов имени, которых нет в этом пути.

Например: / a / b / c начинается с / a / b, a / b / c / d начинается с a / b / c

Давайте посмотрим на различные возможные случаи при вызове метода:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@Test
public void testStartsWith(){
    //both paths are absolute
    Path path = Paths.get("/src", "main", "resources", "test1");
    Path other = Paths.get("/src", "main", "resources");
    assertThat(path.startsWith(other)).isTrue();
 
    /*
    both paths are absolute, where as the other
    path has more name elements
    */
    path = Paths.get("/src", "main", "resources", "test1");
    other = Paths.get("/src", "main", "resources",
        "test1", "test2");
    assertThat(path.startsWith(other)).isFalse();
 
    //both paths are same
    path = Paths.get("/src", "main", "resources", "test1");
    other = Paths.get("/src", "main", "resources", "test1");
    assertThat(path.startsWith(other)).isTrue();
 
    //either of them is relative
    path = Paths.get("src", "main", "resources", "test1");
    other = Paths.get("/src", "main", "resources", "test1");
    assertThat(path.startsWith(other)).isFalse();
 
    //both of them are relative
    path = Paths.get("src", "main", "resources", "test1");
    other = Paths.get("src", "main", "resources");
    assertThat(path.startsWith(other)).isTrue();
 
}
Ссылка: Знакомство с java.nio.file.Path — 2 от нашего партнера по JCG Мохамеда Санауллы в блоге Experiences Unlimited .