В первой части мы рассмотрели большинство API в классе java.nio.file.Path . В этой статье мы рассмотрим остальные API.
Использование register ()
Этот API позволяет нам регистрировать реализацию интерфейса java.nio.file.WatchService, который будет прослушивать такие события, как создание, изменение и удаление каталога. И это намекает на слушателей с помощью java.nio.file.WatchKey. Я хотел бы посвятить другую статью этому API, потому что она включает в себя еще одну новую функцию, которая была представлена в Java 7.
Использование resol ()
Этот метод имеет дело с двумя экземплярами Path . В этом случае вызывается один экземпляр метода resol (), а другой — в качестве аргумента. Аргументом может быть либо экземпляр Path, либо строка, представляющая путь.
Этот метод разрешает другой путь против этого пути. Решение сделано следующим образом:
- Если другой путь является абсолютным, он возвращает другой путь. Потому что другой путь может быть достигнут с помощью абсолютного пути.
- Если другой путь является относительным путем, то другой путь добавляется к этому пути. Например:
12345
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 . |