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

Создание и Чтение Каталогов

Некоторые из методов, ранее обсужденных, такой как delete, работа над файлами, ссылками и каталогами. Но как Вы перечисляете все каталоги наверху файловой системы? Как Вы перечисляете содержание каталога или создаете каталог?

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

Перечисление Корневых каталогов Файловой системы

Можно перечислить все корневые каталоги для файловой системы при использовании FileSystem.getRootDirectories метод. Этот метод возвращается Iterable, который позволяет Вам использовать улучшенный для оператора, чтобы выполнить итерации по всем корневым каталогам.

Следующий фрагмент кода печатает корневые каталоги для файловой системы значения по умолчанию:

Iterable<Path> dirs = FileSystems.getDefault().getRootDirectories();
for (Path name: dirs) {
    System.err.println(name);
}

Создание Каталога

Можно создать новый каталог при использовании createDirectory(Path, FileAttribute<?>) метод. Если Вы не определяете никого FileAttributes, у нового каталога будут атрибуты по умолчанию. Например:

Path dir = ...;
Files.createDirectory(path);

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

Set<PosixFilePermission> perms =
    PosixFilePermissions.fromString("rwxr-x---");
FileAttribute<Set<PosixFilePermission>> attr =
    PosixFilePermissions.asFileAttribute(perms);
Files.createDirectory(file, attr);

Чтобы создать каталог несколько уровней глубоко, когда один или больше родительских каталогов еще не мог бы существовать, можно использовать метод удобства, createDirectories(Path, FileAttribute<?>). Как с createDirectory(Path, FileAttribute<?>) метод, можно определить дополнительный набор начальных атрибутов файла. Следующий фрагмент кода использует атрибуты по умолчанию:

Files.createDirectories(Paths.get("foo/bar/test"));

Каталоги создаются, как необходимый, от вершины вниз. В foo/bar/test пример, если foo каталог не существует, он создается. Затем, bar каталог создается, если нужно, и, наконец, test каталог создается.

Для этого метода возможно перестать работать после создания некоторых, но не всех, родительских каталогов.

Создание Временного Каталога

Можно создать временный каталог, используя один из createTempDirectory методы:

Первый метод позволяет коду определять расположение для временного каталога, и второй метод создает новый каталог в значении по умолчанию временный-fle каталог.

Перечисление Содержания Каталога

Можно перечислить все содержание каталога при использовании newDirectoryStream(Path) метод. Этот метод возвращает объект, который реализует DirectoryStream интерфейс. class, который реализует DirectoryStream взаимодействуйте через интерфейс также реализует Iterable, таким образом, можно выполнить итерации через поток каталога, читая все объекты. Этот подход масштабируется хорошо к очень большим каталогам.


Помните: возвращенный DirectoryStream поток. Если Вы не используете a try-оператор с ресурсами, не забывайте окружать поток finally блок. try-оператор с ресурсами заботится об этом для Вас.

Следующий фрагмент кода показывает, как напечатать содержание каталога:

Path dir = ...;
try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
    for (Path file: stream) {
        System.out.println(file.getFileName());
    }
} catch (IOException | DirectoryIteratorException x) {
    // IOException can never be thrown by the iteration.
    // In this snippet, it can only be thrown by newDirectoryStream.
    System.err.println(x);
}

Path объекты, возвращенные iterator, являются именами записей, разрешенных против каталога. Так, если Вы перечисляете содержание /tmp каталог, записи возвращаются с формой /tmp/a, /tmp/b, и так далее.

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

Отметьте это, если есть исключение во время итерации каталога тогда DirectoryIteratorException бросается с IOException как причина. Методы Iterator не могут выдать исключения исключения.

Фильтрация Перечисления Каталога При использовании Globbing

Если Вы хотите выбрать только файлы и подкаталоги, где каждое имя соответствует определенный образец, можно сделать так при использовании newDirectoryStream(Path, String) метод, который обеспечивает встроенный фильтр шарика. Если Вы не знакомы с синтаксисом шарика, см., Каков Шарик?

Например, следующий фрагмент кода перечисляет файлы, касающиеся Java:.class.java, и.jar файлы.:

Path dir = ...;
try (DirectoryStream<Path> stream =
     Files.newDirectoryStream(dir, "*.{java,class,jar}")) {
    for (Path entry: stream) {
        System.out.println(entry.getFileName());
    }
} catch (IOException x) {
    // IOException can never be thrown by the iteration.
    // In this snippet, it can // only be thrown by newDirectoryStream.
    System.err.println(x);
}

Запись Вашего Собственного Фильтра Каталога

Возможно, Вы хотите фильтровать содержание каталога, основанного на некотором условии кроме сопоставления с образцом. Можно создать свой собственный фильтр, реализовывая DirectoryStream.Filter<T> интерфейс. Этот интерфейс состоит из одного метода, accept, который определяет, выполняет ли файл требование поиска.

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

DirectoryStream.Filter<Path> filter =
    newDirectoryStream.Filter<Path>() {
    public boolean accept(Path file) throws IOException {
        try {
            return (Files.isDirectory(path));
        } catch (IOException x) {
            // Failed to determine if it's a directory.
            System.err.println(x);
            return false;
        }
    }
};

Как только фильтр был создан, он может быть вызван при использовании newDirectoryStream(Path, DirectoryStream.Filter<? super Path>) метод. Следующий фрагмент кода использует isDirectory фильтруйте, чтобы напечатать только подкаталоги каталога к стандартному выводу:

Path dir = ...;
try (DirectoryStream<Path>
                       stream = Files.newDirectoryStream(dir, filter)) {
    for (Path entry: stream) {
        System.out.println(entry.getFileName());
    }
} catch (IOException x) {
    System.err.println(x);
}

Этот метод используется, чтобы фильтровать единственный каталог только. Однако, если бы Вы хотите найти все подкаталоги в дереве файла, Вы использовали бы механизм для Обхода Дерева Файла.


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

Предыдущая страница: Файлы Произвольного доступа
Следующая страница: Ссылки, Символьные или Иначе