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