昨日の続き、、ディレクトリを走査するもの、名前が良くないので、FileCollection と名付け
さらに、Predicate を走査ではさみたくなった。
import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; import java.util.function.Predicate; /** * ファイルコレクション. */ public final class FileCollection { private File file; private FileCollection(String path){ file = new File(path); } /** * インスタンス取得. * @param path コレクションするファイルパス * @return FileCollection */ public static FileCollection of(String path){ return new FileCollection(path); } /** * @return file */ public File getFile(){ return file; } /** * 走査実行→コレクション取得. * @return List<File> */ public List<File> scan(){ return parse(file, new ArrayList<>()); } /** * Predicate走査実行→コレクション取得. * @param p 検査するPredicate<File> * @return List<File> */ public List<File> scan(Predicate<File> p){ return parse(file, new ArrayList<>(), p); } /** * 走査 Consumer実行. * @param c Consumer */ public void scan(Consumer<File> c){ parse(file, c); } /** * Predicate走査 Consumer実行. * @param p 検査するPredicate<File> * @param c Consumer */ public void scan(Predicate<File> p, Consumer<File> c){ parse(file, p, c); } /** * Predicate検査一致の成否. * @param p 検査するPredicate<File> * @return true=1つ以上一致するものがある。false=一致するものが存在しない。 */ public boolean anyMatch(Predicate<File> p){ return findmatch(file, p); } private List<File> parse(File file, List<File> list){ list.add(file); if (file.isDirectory()){ for(File f:file.listFiles()){ parse(f, list); } } return list; } private void parse(File file, Consumer<File> c){ c.accept(file); if (file.isDirectory()){ for(File f:file.listFiles()){ parse(f, c); } } } private List<File> parse(File file, List<File> list, Predicate<File> p){ if (p.test(file)) list.add(file); if (file.isDirectory()){ for(File f:file.listFiles()){ parse(f, list, p); } } return list; } private void parse(File file, Predicate<File> p, Consumer<File> c){ if (p.test(file)) c.accept(file); if (file.isDirectory()){ for(File f:file.listFiles()){ parse(f, p, c); } } } private boolean findmatch(File file, Predicate<File> p){ if (p.test(file)) return true; if (file.isDirectory()){ for(File f:file.listFiles()){ if (findmatch(f, p)) return true; } } return false; } }
Example : /var 配下、ls -R オプションのように全ての log ファイルを抜き出す。
FileCollection.of("/var").scan(p->p.getName().endsWith(".log"), f->{ System.out.println(f.getAbsolutePath()); });
Example : /var 配下、1個でも "error" がつくファイル名が存在したら何かする
if (FileCollection.of("/var").anyMatch(f->f.getName().indexOf("error") >= 0)){ // TODO }