Spec-Zone .ru
спецификации, руководства, описания, API
След: Существенные Классы
Урок: Основной ввод-вывод
Раздел: Файловый ввод-вывод (Обладающий NIO.2)
Подраздел: Класс Пути
Операции пути
Домашняя страница > Существенные Классы > Основной ввод-вывод

Операции пути

Path class включает различные методы, которые могут использоваться, чтобы получить информацию о пути, элементах доступа пути, преобразовать путь к другим формам, или извлекать части пути. Есть также методы для того, чтобы соответствовать строку пути и методы для того, чтобы удалить избыточность в пути. Этот урок адресует их Path методы, иногда называемые синтаксическими операциями, потому что они работают на пути непосредственно и не получают доступ к файловой системе.

Этот раздел покрывает следующее:

Создание Пути

A Path экземпляр содержит информацию, используемую, чтобы определить расположение файла или каталога. В то время, когда это определяется, a Path предоставляется серию одного или более имен. Корневой элемент или имя файла могли бы быть включены, но ни один не требуется. A Path мог бы состоять из только единственного каталога или имени файла.

Можно легко создать a Path объект при использовании одного из следующих get методы от Paths (отметьте множественное число), помощник class:

Path p1 = Paths.get("/tmp/foo");
Path p2 = Paths.get(args[0]);
Path p3 = Paths.get(URI.create("file:///Users/joe/FileTest.java"));

Paths.get метод является сокращением для следующего кода:

Path p4 = FileSystems.getDefault().getPath("/users/sally");

Следующий пример создает /u/joe/logs/foo.log принятие Вашего корневого каталога /u/joe, или C:\joe\logs\foo.log если Вы находитесь на Windows.

Path p5 = Paths.get(System.getProperty("user.home"),"logs", "foo.log");

Получение информации о Пути

Можно думать Path как хранящий эти элементы имени как последовательность. Самый высокий элемент в структуре каталогов был бы расположен в, индексируют 0. Самый низкий элемент в структуре каталогов был бы расположен в, индексируют [n-1], где n число элементов имени в Path. Методы доступны для получения отдельных элементов или подпоследовательности Path использование их индексирует.

Примеры в этом уроке используют следующую структуру каталогов.

Демонстрационная структура каталогов

Демонстрационная Структура каталогов

Следующий фрагмент кода определяет a Path экземпляр и затем вызывает несколько методов, чтобы получить информацию о пути:

// None of these methods requires that the file corresponding
// to the Path exists.
// Microsoft Windows syntax
Path path = Paths.get("C:\\home\\joe\\foo");

// Solaris syntax
Path path = Paths.get("/home/joe/foo");

System.out.format("toString: %s%n", path.toString());
System.out.format("getFileName: %s%n", path.getFileName());
System.out.format("getName(0): %s%n", path.getName(0));
System.out.format("getNameCount: %d%n", path.getNameCount());
System.out.format("subpath(0,2): %s%n", path.subpath(0,2));
System.out.format("getParent: %s%n", path.getParent());
System.out.format("getRoot: %s%n", path.getRoot());

Вот вывод и для Windows и для Соляриса ОС:

Вызванный метод Возвраты в Солярисе ОС Возвраты в Microsoft Windows Комментарий
toString /home/joe/foo C:\home\joe\foo Возвращает строковое представление Path. Если путь создавался, используя Filesystems.getDefault().getPath(String) или Paths.get (последний является методом удобства для getPath), метод выполняет незначительную синтаксическую уборку. Например, в операционной системе UNIX, это исправит строку ввода //home/joe/foo к /home/joe/foo.
getFileName foo foo Возвращает имя файла или последний элемент последовательности элементов имени.
getName(0) home home Возвращается элемент пути, соответствующий указанному, индексируют. 0th элемент является элементом пути, самым близким к корню.
getNameCount 3 3 Возвращает число элементов в пути.
subpath(0,2) home/joe home\joe Возвращает подпоследовательность Path (не включая корневой элемент), как определено к началу и окончанию индексирует.
getParent /home/joe \home\joe Возвращает путь родительского каталога.
getRoot / C:\ Возвращает корень пути.

Предыдущий пример показывает вывод для абсолютного пути. В следующем примере определяется относительный путь:

// Solaris syntax
Path path = Paths.get("sally/bar");
or
// Microsoft Windows syntax
Path path = Paths.get("sally\\bar");

Вот является вывод для Windows и Соляриса ОС:

Вызванный метод Возвраты в Солярисе ОС Возвраты в Microsoft Windows
toString sally/bar sally\bar
getFileName bar bar
getName(0) sally sally
getNameCount 2 2
subpath(0,1) sally sally
getParent sally sally
getRoot null null

Удаление Избыточности От Пути

Много файловых систем используют "." нотацию, чтобы обозначить текущий каталог и ".." обозначить родительский каталог. У Вас могла бы быть ситуация где a Path содержит избыточную информацию о каталоге. Возможно, сервер конфигурируется, чтобы сохранить его файлы журнала в"/dir/logs/."каталог, и Вы хотите удалить запаздывание"/."нотация от пути.

Следующие примеры оба включают избыточность:

/home/./joe/foo
/home/sally/../joe/foo

normalize метод удаляет любые избыточные элементы, который включает любого"."или"directory/.."возникновения. Оба из предыдущих примеров нормализуют к /home/joe/foo.

Важно отметить это normalize не проверяет в файловой системе, когда она очищает путь. Это - просто синтаксическая работа. Во втором примере, если sally была символьная ссылка, удаляя sally/.. мог бы привести к a Path это больше не определяет местоположение намеченного файла.

Чтобы очистить путь, гарантируя, что результат определяет местоположение корректного файла, можно использовать toRealPath метод. Этот метод описывается в следующем разделе, Преобразовывая Путь.

Преобразование Пути

Можно использовать три метода, чтобы преобразовать Path. Если Вы должны преобразовать путь к строке, которая может быть открыта от браузера, можно использовать toUri. Например:

Path p1 = Paths.get("/home/logfile");
// Result is file:///home/logfile
System.out.format("%s%n", p1.toUri());

toAbsolutePath метод преобразовывает путь к абсолютному пути. Если переданный - в пути является уже абсолютным, он возвращает то же самое Path объект. toAbsolutePath метод может быть очень полезным, обрабатывая вводимые пользователем имена файлов. Например:

public class FileTest {
    public static void main(String[] args) {

        if (args.length < 1) {
            System.out.println("usage: FileTest file");
            System.exit(-1);
        }

        // Converts the input string to a Path object.
        Path inputPath = Paths.get(args[0]);

        // Converts the input Path
        // to an absolute path.
        // Generally, this means prepending
        // the current working
        // directory.  If this example
        // were called like this:
        //     java FileTest foo
        // the getRoot and getParent methods
        // would return null
        // on the original "inputPath"
        // instance.  Invoking getRoot and
        // getParent on the "fullPath"
        // instance returns expected values.
        Path fullPath = inputPath.toAbsolutePath();
    }
}

toAbsolutePath метод преобразовывает ввод данных пользователем и возвращает a Path это возвращает полезные значения когда запрошено. Файл не должен существовать для этого метода, чтобы работать.

toRealPath метод возвращает реальный путь существующего файла. Этот метод выполняет несколько операций в одном:

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

try {
    Path fp = path.toRealPath(true);
} catch (NoSuchFileException x) {
    System.err.format("%s: no such" + " file or directory%n", path);
    // Logic for case when file doesn't exist.
} catch (IOException x) {
    System.err.format("%s%n", x);
    // Logic for other sort of file error.
}

Присоединение к Двум Путям

Можно объединить пути при использовании resolve метод. Вы передаете в частичном пути, который является путем, который не включает корневой элемент, и что частичный путь добавляется к исходному пути.

Например, рассмотрите следующий фрагмент кода:

// Solaris
Path p1 = Paths.get("/home/joe/foo");
// Result is /home/joe/foo/bar
System.out.format("%s%n", p1.resolve("bar"));

or

// Microsoft Windows
Path p1 = Paths.get("C:\\home\\joe\\foo");
// Result is C:\home\joe\foo\bar
System.out.format("%s%n", p1.resolve("bar"));

Передача абсолютного пути к resolve метод возвращает переданный - в пути:

// Result is /home/joe
Paths.get("foo").resolve("/home/joe");

Создание Пути Между Двумя Путями

Общее требование, когда Вы пишете код файлового ввода-вывода, является возможностью создать путь из одного расположения в файловой системе к другому расположению. Можно встретить это использование relativize метод. Этот метод создает путь, происходящий из исходного пути и заканчивающийся в расположении, определенном переданным - в пути. Новый путь относительно исходного пути.

Например, считайте два относительных пути определенными как joe и sally:

Path p1 = Paths.get("joe");
Path p2 = Paths.get("sally");

В отсутствие любой другой информации это принимается это joe и sally одноуровневые элементы, означая узлы, которые находятся на том же самом уровне в древовидной структуре. Перемещаться от joe к sally, Вы ожидали бы сначала перемещаться по одному уровню до родительского узла и затем вниз к sally:

// Result is ../sally
Path p1_to_p2 = p1.relativize(p2);
// Result is ../joe
Path p2_to_p1 = p2.relativize(p1);

Рассмотрите немного более сложный пример:

Path p1 = Paths.get("home");
Path p3 = Paths.get("home/sally/bar");
// Result is sally/bar
Path p1_to_p3 = p1.relativize(p3);
// Result is ../..
Path p3_to_p1 = p3.relativize(p1);

В этом примере эти два пути совместно используют тот же самый узел, home. Перемещаться от home к bar, Вы сначала перемещаетесь, каждый уравнивает к sally и затем еще один уравнивать к bar. Навигация от bar к home требует перемещающийся вверх два уровня.

Относительный путь не может быть создан, если только один из путей включает корневой элемент. Если оба пути включают корневой элемент, возможность создать относительный путь системно-зависима.

Рекурсивное Copy пример использует relativize и resolve методы.

Сравнение Двух Путей

Path class поддерживает equals, то, чтобы позволять Вам протестировать два пути на равенство. startsWith и endsWith методы позволяют Вам протестировать, начинается ли путь или заканчивается определенной строкой. Эти методы удобны. Например:

Path path = ...;
Path otherPath = ...;
Path beginning = Paths.get("/home");
Path ending = Paths.get("foo");

if (path.equals(otherPath)) {
    // equality logic here
} else if (path.startsWith(beginning)) {
    // path begins with "/home"
} else if (path.endsWith(ending)) {
    // path ends with "foo"
}

Path class реализует Iterable интерфейс. iterator метод возвращает объект, который позволяет Вам выполнить итерации по элементам имени в пути. Первый возвращенный элемент то, что самым близким к корню в дереве каталогов. Следующий фрагмент кода выполняет итерации по пути, печатая каждый элемент имени:

Path path = ...;
for (Path name: path) {
    System.out.println(name);
}

Path class также реализует Comparable интерфейс. Можно сравниться Path объекты при использовании compareTo который полезен для сортировки.

Можно также поместить Path объекты в a Collection. См., что Наборы запаздывают для получения дополнительной информации об этой мощной функции.

Когда Вы хотите проверить это два Path объекты определяют местоположение того же самого файла, можно использовать isSameFile метод, как описано в Проверке, определяют Ли Два Пути Местоположение Того же самого Файла.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Класс Пути
Следующая страница: Операции Файла