Статьи

Введение в NIO.2 (JSR 203). Часть 6. Фильтрация содержимого каталога и обход файлового дерева.

В этой части мы рассмотрим, как работает обходчик дерева каталогов и средство чтения потоков каталогов. Эти две функции — еще одна пара давно запрашиваемых функций, которые не были включены в ядро ​​Java до Java 7.

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

Для фильтрации мы можем использовать выражение PathMatcher, соответствующее имени файла, или мы можем фильтровать содержимое каталога на основе различных атрибутов файла. например, основанный на разрешениях файла или размере файла.

В следующем примере кода показано, как использовать DirectoryStream вместе с фильтрацией. Для использования выражения PathMatcher мы можем просто использовать другую перегрузку метода newDirectoryStream, который принимает выражение PathMatcher вместо фильтра.

public class DirectoryStream2 {

public static void main(String args[]) throws IOException {
//Getting default file system and getting a path
FileSystem fs = FileSystems.getDefault();
Path p = fs.getPath("/usr/bin");

//creating a directory streamer filter
DirectoryStream.Filter
filter = new DirectoryStream.Filter
() {

public boolean accept(Path file) throws IOException {
long size = Attributes.readBasicFileAttributes(file).size();
String perm = PosixFilePermissions.toString(Attributes.readPosixFileAttributes(file).permissions());
if (size > 8192L && perm.equalsIgnoreCase("rwxr-xr-x")) {
return true;
}
return false;
}
};
// creating a directory streamer with the newly developed filter
DirectoryStream
ds = p.newDirectoryStream(filter);
Iterator
it = ds.iterator();
while (it.hasNext()) {

Path pp = it.next();

System.out.println(pp.getName());
}
}
}

Приведенный выше код говорит сам за себя, и я не буду объяснять его дальше, чем встроенные комментарии.

Следующая тема этой записи — обход дерева каталогов или, в основном, API для посетителей файлов. Этот API позволяет нам проходить по дереву файловой системы и выполнять любые операции над файлами, которые мы нашли. Хорошей новостью является то, что мы можем сканировать до любой глубины, которая нам требуется, используя предоставленный API.

Благодаря API обхода дерева каталогов ядро ​​Java позволяет нам зарегистрировать более обширный класс в API обхода дерева каталогов, а затем для каждой записи, с которой сталкивается API, в виде файла или папки, он вызывает наш метод посетителя ds . Итак, первое, что нам нужно, это посетитель, чтобы зарегистрировать его на дереве. В следующем фрагменте показан простой посетитель, который печатает только тип файла с использованием файлов. probeContentType () метод.

class visit extends SimpleFileVisitor
{

@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
try {
System.out.println(Files.probeContentType(file));

} catch (IOException ex) {
Logger.getLogger(visit.class.getName()).log(Level.SEVERE, null, ex);
}
return super.visitFile(file, attrs);
}

@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) {
return super.postVisitDirectory(dir, exc);
}

@Override
public FileVisitResult preVisitDirectory(Path dir) {
return super.preVisitDirectory(dir);
}

@Override
public FileVisitResult preVisitDirectoryFailed(Path dir, IOException exc) {
return super.preVisitDirectoryFailed(dir, exc);
}

@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) {
return super.visitFileFailed(file, exc);
}
}

Как вы можете видеть , что мы расширили SimpleFileVisitor и мы имеем посетитель мето дц для всех возможных случаев.

Теперь, когда у нас есть класс посетителя, остальная часть кода проста. В следующем примере показано, как пройти каталог / home / masoud до двух уровней.

public class FileVisitor {

public static void main(String args[]) {

FileSystem fs = FileSystems.getDefault();
Path p = fs.getPath("/home/masoud");
visit v = new visit();
Files.walkFileTree(p, EnumSet.allOf(FileVisitOption.class), 2, v);

}
}

Вы можете получить самую последнюю версию Java 7, известную как Dolphin,
отсюда и на той же странице вы можете получить последнюю версию JavaDoc, сгенерированную из того же исходного кода, который используется для генерации двоичных битов. Другие записи этой серии находятся под 
тегом
NIO.2 моего блога.

От http://kalali.me/introduction-nio-2-jsr-203-part-6-filtering-directory-content-and-walking-over-a-file-tree/