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