Spec-Zone .ru
спецификации, руководства, описания, API
|
Некоторые из методов, ранее обсужденных, такой как 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
методы:
createTempDirectory(Path, String, FileAttribute<?>...)
createTempDirectory(String, FileAttribute<?>...)
Первый метод позволяет коду определять расположение для временного каталога, и второй метод создает новый каталог в значении по умолчанию временный-fle каталог.
Можно перечислить все содержание каталога при использовании newDirectoryStream(Path)
DirectoryStream
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 не могут выдать исключения исключения.
Если Вы хотите выбрать только файлы и подкаталоги, где каждое имя соответствует определенный образец, можно сделать так при использовании 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); }
Этот метод используется, чтобы фильтровать единственный каталог только. Однако, если бы Вы хотите найти все подкаталоги в дереве файла, Вы использовали бы механизм для