2015-10-17 9 views
0

Так что я должен использовать систему дерева файлов Java, потому что файлы .listfiles по какой-то причине невероятно медленно проходят через удаленную сеть. Однако все примеры системных файлов Java перечисляют все файлы в подкаталогах, сильно замедляя работу программы. Как я могу сделать это так, чтобы он выполнял поиск только в каталоге и возвращал имена папок и файлов только в этом каталоге, а не в подкаталогах.Использование системы дерева файлов Java для получения только файлов и папок, а не подкаталогов

Пример кода:

package javaapplication6; 

import java.io.IOException; 
import java.nio.file.FileVisitResult; 
import java.nio.file.FileVisitor; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.nio.file.SimpleFileVisitor; 
import java.nio.file.attribute.BasicFileAttributes; 

/** Recursive listing with SimpleFileVisitor in JDK 7. */ 
public final class JavaApplication6 { 

    public static void main(String... aArgs) throws IOException{ 
    String ROOT = "\\\\directory"; 
    FileVisitor<Path> fileProcessor = new ProcessFile(); 
    Files.walkFileTree(Paths.get(ROOT), fileProcessor); 
    } 

    private static final class ProcessFile extends SimpleFileVisitor<Path> { 
    @Override public FileVisitResult visitFile(
     Path aFile, BasicFileAttributes aAttrs 
    ) throws IOException { 
     System.out.println("Processing file:" + aFile); 
     return FileVisitResult.CONTINUE; 
    } 

    @Override public FileVisitResult preVisitDirectory(
     Path aDir, BasicFileAttributes aAttrs 
    ) throws IOException { 
     System.out.println("Processing directory:" + aDir); 
     return FileVisitResult.CONTINUE; 
    } 
    } 
} 

Любое понимание или помощь будет принята с благодарностью, спасибо.

+0

Если вы не хотите перезаписывать файлы, почему вы используете 'Files.walkFileTree'? Вы можете просто использовать «DirectoryStream» с фильтром. – Tunaki

+0

Не ускоренная прогулка? –

+0

Речь идет не о скорости, а о цели: 'walkFileTree' desiged, согласно его имени, для того, чтобы ходить по файловому дереву, это означает рекурсию внутри подкаталогов. Если вы просто хотите перечислить содержимое папки (без рекурсии), то «DirectoryStream» - это то, что вы должны использовать. Этот класс предназначен для обработки очень больших каталогов. – Tunaki

ответ

0

Использование потока Справочника, по-видимому, работает более быстро и легко.

0

Используйте длинную версию метода walkFileTree, что позволяет устанавливать maxDepth как так:

Files.walkFileTree(Paths.get(ROOT), EnumSet.noneOf(FileVisitOption.class), 
    1, fileProcessor); 

Обратите внимание, что в отличие от простого случая поддиректории корня будет генерировать вызовы к visitFile. Более общие подкаталоги на уровне maxDepth генерируют вызовы visitFile, но не звонки на preVisitDirectory и postVisitDirectory.