Je cherche une liberme qui fournirait une méthode qui me donnerait une liste de fichiers correspondant à un motif de type fourmis.
pour * FOO / ** / *. TXT code> J'aurais P> PathMatcher mat = FileSystems.getDefault().getPathMatcher("glob:" + filesPattern);
3 Réponses :
Alors j'ai sacrifié quelques MB de la taille de l'application pour le souci de vitesse et utilisé DistoireCanner Code> à la fin.
Aussi, il y a le printemps pathmatchingResourcePatternResolver . p>
public class PatternDirWalker {
//private static final Logger log = LoggerFactory.getLogger( PatternDirWalker.class );
private String pattern;
private List segments;
private PathMatcher mat;
public PatternDirWalker( String pattern ) {
this.pattern = pattern;
this.segments = parseSegments(pattern);
this.mat = FileSystems.getDefault().getPathMatcher("glob:" + pattern);
}
public List<File> list( File dirToScan ) throws IOException{
return new DirectoryWalker() {
List<File> files = new LinkedList();
@Override protected void handleFile( File file, int depth, Collection results ) throws IOException {
if( PatternDirWalker.this.mat.matches( file.toPath()) )
results.add( file );
}
public List<File> findMatchingFiles( File dirToWalk ) throws IOException {
this.walk( dirToWalk, this.files );
return this.files;
}
}.findMatchingFiles( dirToScan );
}// list()
private List<Segment> parseSegments( String pattern ) {
String[] parts = StringUtils.split("/", pattern);
List<Segment> segs = new ArrayList(parts.length);
for( String part : parts ) {
Segment seg = new Segment(part);
segs.add( seg );
}
return segs;
}
class Segment {
public final String pat; // TODO: Tokenize
private Segment( String pat ) {
this.pat = pat;
}
}
}// class
Google GUAVA a un tableau de Treeferser pour les fichiers qui vous permet de faire de la profondeur - premier et Première énumération de fichiers dans un répertoire. Vous pouvez ensuite filtrer les résultats en fonction d'une regex du nom de fichier ou de tout ce que vous devez faire.
Voici un exemple (nécessite GUAVA): P>
import java.io.File;
import java.util.List;
import java.util.regex.Pattern;
import com.google.common.base.Function;
import com.google.common.base.Predicates;
import com.google.common.io.Files;
import com.google.common.collect.Iterables;
import com.google.common.collect.TreeTraverser;
public class FileTraversalExample {
private static final String PATH = "/path/to/your/maven/repo";
private static final Pattern SEARCH_PATTERN = Pattern.compile(".*\\.jar");
public static void main(String[] args) {
File directory = new File(PATH);
TreeTraverser<File> traverser = Files.fileTreeTraverser();
Iterable<String> allFiles = Iterables.transform(
traverser.breadthFirstTraversal(directory),
new FileNameProducingPredicate());
Iterable<String> matches = Iterables.filter(
allFiles,
Predicates.contains(SEARCH_PATTERN));
System.out.println(matches);
}
private static class FileNameProducingPredicate implements Function<File, String> {
public String apply(File input) {
return input.getAbsolutePath();
}
}
}
AS de Java 7 Il y a une analyse répertoire récursive. Java 8 peut l'améliorer un peu syntaxiquement.
public static void walk(Path start, String searchGlob) throws IOException {
final Glob glob = new Glob(searchGlob);
Files.walkFileTree(start, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file,
BasicFileAttributes attrs) throws IOException {
if (glob.matchesFile(file)) {
...; // Process file
}
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult preVisitDirectory(Path dir,
BasicFileAttributes attrs) throws IOException {
return glob.matchesParentDir(dir)
? FileVisitResult.CONTINUE : FileVisitResult.SKIP_SUBTREE;
}
});
}
Pourriez-vous s'il vous plaît élaborer sur le globe global? Je ne sais pas trop comment implémenter les pièces manquantes.
Ma réponse n'est pas optimale, car elle n'utilise pas les pièces constantes du motif Glob, comme / src / main / '. Le GLOB pourrait être mis en œuvre à partir de chaque sous-répertoire de rubrique, Code> * FOO / ** / *. TXT` comme premier dans la recherche de répertoire de courant * FOO code>.
fichier.list (Filenamefilter) code> Pas utile?Ce n'est pas récursif.