|
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);
Чтобы создать каталог несколько уровней глубоко, когда один или больше родительских каталогов еще не мог бы существовать, можно использовать метод удобства, . Как с createDirectory(Path, FileAttribute<?>) метод, можно определить дополнительный набор начальных атрибутов файла. Следующий фрагмент кода использует атрибуты по умолчанию:
Files.createDirectories(Paths.get("foo/bar/test"));
Каталоги создаются, как необходимый, от вершины вниз. В foo/bar/test пример, если foo каталог не существует, он создается. Затем, bar каталог создается, если нужно, и, наконец, test каталог создается.
Для этого метода возможно перестать работать после создания некоторых, но не всех, родительских каталогов.
Можно создать временный каталог, используя один из createTempDirectory методы:
Первый метод позволяет коду определять расположение для временного каталога, и второй метод создает новый каталог в значении по умолчанию временный-fle каталог.
Можно перечислить все содержание каталога при использовании метод. Этот метод возвращает объект, который реализует интерфейс. 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 не могут выдать исключения исключения.
Если Вы хотите выбрать только файлы и подкаталоги, где каждое имя соответствует определенный образец, можно сделать так при использовании метод, который обеспечивает встроенный фильтр шарика. Если Вы не знакомы с синтаксисом шарика, см.
Например, следующий фрагмент кода перечисляет файлы, касающиеся 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;
}
}
};
Как только фильтр был создан, он может быть вызван при использовании метод. Следующий фрагмент кода использует 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);
}
Этот метод используется, чтобы фильтровать единственный каталог только. Однако, если бы Вы хотите найти все подкаталоги в дереве файла, Вы использовали бы механизм для