Paths

Модуль 1. Java Syntax
26 уровень , 4 лекция
Открыта

Утилитарный класс и метод

Утилитарный класс — это класс-помощник, содержащий статические переменные и статические методы, которые выполняют определенный перечень задач, объединённых одним смыслом.

Давайте рассмотрим примеры стандартных утилитарных классов:

java.lang.Math Класс, который может выполнять множество различных математических вычислений, дает нам некоторые математические константы.
java.util.Arrays Класс содержит различные методы для работы с массивами (такие как сортировка и поиск). Этот класс также содержит статическую фабрику, которая позволяет просматривать массивы как списки.
java.lang.System Класс реализует методы для работы с системой. Чаще всего мы можем его использовать для вывода текста в консоли. Для этого мы обращаемся к статической переменной out, которая хранит в себе объект класса PrintStream, и уже у него вызываем метод println (System.out.println).

Мы можем и сами создать утилитарный класс: для этого мы просто создаем класс со статическими public методами, которые нам необходимы. Но нужно помнить, что для создания утилитарного класса необходимы весомые причины. Например, необходимость использования одного и того же метода или набора методов, выполняющего единственную задачу (скажем, сложное вычисление) из нескольких различных классов.

Давай рассмотрим пример утилитарного класса — класс Paths.

Класс Paths

Это класс состоит всего из одного статического метода — get — с разными принимаемыми параметрами.

Мы можем передать в метод get:

get(String first, String... more) Путь целиком, либо перечисление названий директорий и (или) файла в последнем аргументе.
get(URI uri) URI.

Этот утилитарный класс решает задачу преобразования пути (в виде строки) или URI в Path. Path мы уже проходили и понимаем, зачем он нам нужен и как мы с ним далее можем работать.

Часто бывает, что мы имеем дело с путем именно в виде String или URI. Вот тут-то мы и можем воспользоваться методами утилитарного класса Paths.

Давайте рассмотрим примеры:

Пример Комментарий

Path path =
Paths.get("C:\\Users\\User\\Documents\\MyFile.txt");
                    
Передаем в метод get String (путь к файлу) и получаем сформированный Path. Далее мы можем с ним работать.

Path path = Paths.get(URI.create("file:///Users/User/Code/MyClass.java"));
                    
Path можно так же получить и из сформированного URI.

Path path = Paths.get(System.getProperty("user.home"),"documents", "document.txt");
                    
Указываем последовательно названия директории и файла, к которому нам нужно получить путь.

Но в самом деле есть один нюанс. С появлением Java 11 версии любая реализация метода get вызывает в себе Path.of.


public static Path get(String first, String... more) {
    return Path.of(first, more);
}
 
public static Path get(URI uri) {
    return Path.of(uri);
}
    

Теперь этот утилитарный класс может быть признан устаревшим, поэтому мы должны использовать именно Path.of для наших целей.

Было Стало

Path path =
Paths.get("C:\\Users\\User\\Documents\\MyFile.txt");
                    

Path path =
Path.of("C:\\Users\\User\\Documents\\MyFile.txt");
                    

Path path = Paths.get(URI.create("file:///Users/User/Code/MyClass.java"));
                    

Path path = Path.of(URI.create("file:///Users/User/Code/MyClass.java"));
                    

Path path = Paths.get(System.getProperty("user.home"),"documents", "document.txt");
                    

ath path = Path.of(System.getProperty("user.home"),"documents", "document.txt");
                    
Комментарии (16)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Константин Уровень 51
1 октября 2025
Почему вторая задача не принимает вариант ниже, который в консоли выводит тоже самое - не понимаю :( public static Path joinToPath(List<String> partsList) { StringBuilder str = new StringBuilder(); for (String part : partsList) { str.append(part); } return Paths.get(str.toString()); }
Пётр Уровень 71
23 апреля 2025
Забавно что если вызвать метод getFirst у partsList, то "Задача не компилируется на сервере". А если сделать get(0) то все ок.
Никита Уровень 66
26 октября 2024
для решения первой задачи не объяснено ни одного факта или понятия. Это просто смешно.
Руслан Никитин Уровень 109
15 июля 2024
Paths.get позволяет составлять путь из строки или из последовательности строк (элементов пути). Он был введен в Java 7 Path.of был введен в Java 11 и предоставляет альтернативный, более современный и упрощенный способ создания объектов пути. "Оба варианта выполняют одну и ту же функцию, и выбор между ними в значительной степени зависит от вашей версии Java. Если вы работаете с Java 7, вы должны использовать Paths.get. Если у вас есть Java 11 или более поздняя версия, вы можете использовать Path.of, так как он предлагает более современный и упрощенный API"
Igor Stupnik Уровень 33
30 марта 2023
по последней задаче добавлю свои пять копеек: в метод отправляем первый элемент и массив из оставшихся элементов.
Руслан Уровень 111 Expert
15 июня 2023
Как и всегда, никто последовательно в лекциях не объяснял, что вторым параметром надо подавать оставшиеся элементы в виде массива.
Никита Уровень 109
3 сентября 2024
Да решение в ответах вообще не красивое, никак не ожидал такой глупости
jvatechs Уровень 111 Expert
3 января 2023
может кому поможет: Насколько стало известно, что тут

Paths.get(String first, String... more)
String... more - ни что иное как массив элементов, так называемые "варарги" (varargs). вот что я вырыл из стэковерфлоу насчет них: Varargs можно использовать, когда мы не уверены в количестве аргументов, которые должны быть переданы в метод. Он создает массив параметров неопределенной длины в фоновом режиме, и такой параметр может обрабатываться как массив во время выполнения. Если у нас есть метод, который перегружен для приема разного количества параметров, то вместо того, чтобы перегружать метод в разное время, мы можем просто использовать концепцию varargs. Базовый метод с таким написанием выглядит примерно так:

void f(T arg1, T... args) {
//делает что-то
}
Василий Уровень 30
12 сентября 2022
Вторая задача хороша, решить не смог
Андрей Уровень 48
26 сентября 2022
Ничего хорошего, когда тебе не оставляют выбора в методе решения задачи.
Никита Уровень 109
3 сентября 2024
Да решение в ответах вообще не красивое, никак не ожидал такой глупости. Проще в цикле собрать string и красиво передать. А тут какие-то массивы, копии массивов...
Сергей Уровень 111 Expert
18 июня 2022

 return Paths.get(partsList.get(0),partsList.get(1),partsList.get(2),partsList.get(3));
Почему так нельзя? Только из-за того, что так указано в исходном коде?

public static Path of(String first, String... more) {
        return FileSystems.getDefault().getPath(first, more);
    }
Так то результат тот же, ну может не так красиво конечно.
Mariia Уровень 51 Expert
19 июня 2022
Наверное, потому что на входе может быть лист любой длины, а такое решение не универсально.
Сергей Уровень 111 Expert
21 июня 2022
Точно, спасибо, так скорее всего и есть
Max Уровень 70
19 декабря 2024
Итератор не принимает :(((
Sergey Drogunov Уровень 111 Expert
11 февраля 2022