web-dev-qa-db-ja.com

Javaを使用してフォルダ内のファイルを検索

フォルダを検索すると_C:\example_と言う場合に必要なこと

次に、各ファイルを調べて、いくつかの開始文字と一致するかどうかを確認する必要があります。

_temp****.txt
tempONE.txt
tempTWO.txt
_

したがって、ファイルがtempで始まり、拡張子が.txtの場合、そのファイル名をFile file = new File("C:/example/temp***.txt);に入れて、ファイルを読み込むことができるようにするには、ループを次のファイルに移動する必要があります上記の条件を満たすかどうかを確認します。

44
Sii

必要なのは File.listFiles(FileNameFilter filter) です。

これにより、特定のフィルタに一致するディレクトリ内のファイルのリストが表示されます。

コードは次のようになります。

// your directory
File f = new File("C:\\example");
File[] matchingFiles = f.listFiles(new FilenameFilter() {
    public boolean accept(File dir, String name) {
        return name.startsWith("temp") && name.endsWith("txt");
    }
});
67
jjnguy

FilenameFilter を次のように使用できます。

File dir = new File(directory);

File[] matches = dir.listFiles(new FilenameFilter()
{
  public boolean accept(File dir, String name)
  {
     return name.startsWith("temp") && name.endsWith(".txt");
  }
});
32
Mia Clarke

これは古い質問です。ただし、完全を期すために、ラムダバージョンを使用します。

File dir = new File(directory);
File[] files = dir.listFiles((dir1, name) -> name.startsWith("temp") && name.endsWith(".txt"));
16
pan

Apache Commons IOを考えてみましょう。このクラスには FileUtils というクラスがあり、これには listFiles メソッドがあり、これは非常に便利です。

4
Waleed Madanat

Java.io.File.list()FilenameFilterをご覧ください。

4
jhouse

Apache commons IOさまざまな

FilenameUtils.wildcardMatch

Apache javadoc here を参照してください。ワイルドカードとファイル名が一致します。したがって、このメソッドを比較に使用できます。

3
eugene

指定されたディレクトリからJsonファイルをリストします。

import Java.io.File;
    import Java.io.FilenameFilter;

    public class ListOutFilesInDir {
        public static void main(String[] args) throws Exception {

            File[] fileList = getFileList("directory path");

            for(File file : fileList) {
                System.out.println(file.getName());
            }
        }

        private static File[] getFileList(String dirPath) {
            File dir = new File(dirPath);   

            File[] fileList = dir.listFiles(new FilenameFilter() {
                public boolean accept(File dir, String name) {
                    return name.endsWith(".json");
                }
            });
            return fileList;
        }
    }
3

@Clarkeが言ったように、Java.io.FilenameFilterを使用して特定の条件でファイルをフィルタリングできます。

補足として、Java.io.FilenameFilterを使用して現在のディレクトリとそのサブディレクトリ内のファイルを検索する方法を示します。

一般的なメソッドgetTargetFilesおよびprintFilesは、ファイルの検索と印刷に使用されます。

public class SearchFiles {

    //It's used in dfs
    private Map<String, Boolean> map = new HashMap<String, Boolean>();

    private File root;

    public SearchFiles(File root){
        this.root = root;
    }

    /**
     * List eligible files on current path
     * @param directory
     *      The directory to be searched
     * @return
     *      Eligible files
     */
    private String[] getTargetFiles(File directory){
        if(directory == null){
            return null;
        }

        String[] files = directory.list(new FilenameFilter(){

            @Override
            public boolean accept(File dir, String name) {
                // TODO Auto-generated method stub
                return name.startsWith("Temp") && name.endsWith(".txt");
            }

        });

        return files;
    }

    /**
     * Print all eligible files
     */
    private void printFiles(String[] targets){
        for(String target: targets){
            System.out.println(target);
        }
    }
}

recursivebfs、およびdfsを使用してジョブを完了する方法をデモします。

再帰

    /**
 * How many files in the parent directory and its subdirectory <br>
 * depends on how many files in each subdirectory and their subdirectory
 */
private void recursive(File path){

    printFiles(getTargetFiles(path));
    for(File file: path.listFiles()){
        if(file.isDirectory()){
            recursive(file);
        }
    }
    if(path.isDirectory()){
        printFiles(getTargetFiles(path));
    }
}

public static void main(String args[]){
    SearchFiles searcher = new SearchFiles(new File("C:\\example"));
    searcher.recursive(searcher.root);
}

幅優先検索

/**
 * Search the node's neighbors firstly before moving to the next level neighbors
 */
private void bfs(){
    if(root == null){
        return;
    }

    Queue<File> queue = new LinkedList<File>();
    queue.add(root);

    while(!queue.isEmpty()){
        File node = queue.remove();
        printFiles(getTargetFiles(node));
        File[] childs = node.listFiles(new FileFilter(){

            @Override
            public boolean accept(File pathname) {
                // TODO Auto-generated method stub
                if(pathname.isDirectory())
                    return true;

                return false;
            }

        });

        if(childs != null){
            for(File child: childs){
                queue.add(child);
            }
        }
    }
}

public static void main(String args[]){
    SearchFiles searcher = new SearchFiles(new File("C:\\example"));
    searcher.bfs();
}

深さ優先検索

/ ** *バックトラックする前に各ブランチに沿って可能な限り検索します*/private void dfs(){

    if(root == null){
        return;
    }

    Stack<File> stack = new Stack<File>();
    stack.Push(root);
    map.put(root.getAbsolutePath(), true);
    while(!stack.isEmpty()){
        File node = stack.peek();
        File child = getUnvisitedChild(node);

        if(child != null){
            stack.Push(child);
            printFiles(getTargetFiles(child));
            map.put(child.getAbsolutePath(), true);
        }else{
            stack.pop();
        }

    }
}

/**
 * Get unvisited node of the node
 * 
 */
private File getUnvisitedChild(File node){

    File[] childs = node.listFiles(new FileFilter(){

        @Override
        public boolean accept(File pathname) {
            // TODO Auto-generated method stub
            if(pathname.isDirectory())
                return true;

            return false;
        }

    });

    if(childs == null){
        return null;
    }

    for(File child: childs){

        if(map.containsKey(child.getAbsolutePath()) == false){
            map.put(child.getAbsolutePath(), false);
        }

        if(map.get(child.getAbsolutePath()) == false){
            return child; 
        }
    }

    return null;
}

public static void main(String args[]){
    SearchFiles searcher = new SearchFiles(new File("C:\\example"));
    searcher.dfs();
}
3
Gearon

Java 1.8では、Files.listを使用してストリームを取得できます。

Path findFile(Path targetDir, String fileName) throws IOException {
    return Files.list(targetDir).filter( (p) -> {
        if (Files.isRegularFile(p)) {
            return p.getFileName().toString().equals(fileName);
        } else {
            return false;
        }
    }).findFirst().orElse(null);
}
1
Ted

この応答 を詳しく説明するには、Apache IO Utilsを使用すると時間を節約できます。特定の名前のファイルを再帰的に検索する次の例を考えてください。

    File file = FileUtils.listFiles(new File("the/desired/root/path"), 
                new NameFileFilter("filename.ext"), 
                FileFilterUtils.trueFileFilter()
            ).iterator().next();

見る:

1
Kyle

ファイルの名前、検索するディレクトリのパスを指定して、ジョブを作成します。

private static String getPath(String drl, String whereIAm) {
    File dir = new File(whereIAm); //StaticMethods.currentPath() + "\\src\\main\\resources\\" + 
    for(File e : dir.listFiles()) {
        if(e.isFile() && e.getName().equals(drl)) {return e.getPath();}
        if(e.isDirectory()) {
            String idiot = getPath(drl, e.getPath());
            if(idiot != null) {return idiot;}
        }
    }
    return null;
}
0
Amiel
  • マッチャー. find およびFiles . walk メソッドは、より柔軟な方法でファイルを検索するオプションです
  • 文字列. format は正規表現を組み合わせて検索制限を作成します
  • Files . isRegularFile パスがディレクトリ、シンボリックリンクなどであるかどうかを確認します。

使用法:

//Searches file names (start with "temp" and extension ".txt")
//in the current directory and subdirectories recursively
Path initialPath = Paths.get(".");
PathUtils.searchRegularFilesStartsWith(initialPath, "temp", ".txt").
                                       stream().forEach(System.out::println);

出典:

public final class PathUtils {

    private static final String startsWithRegex = "(?<![_ \\-\\p{L}\\d\\[\\]\\(\\) ])";
    private static final String endsWithRegex = "(?=[\\.\\n])";
    private static final String containsRegex = "%s(?:[^\\/\\\\]*(?=((?i)%s(?!.))))";

    public static List<Path> searchRegularFilesStartsWith(final Path initialPath, 
                             final String fileName, final String fileExt) throws IOException {
        return searchRegularFiles(initialPath, startsWithRegex + fileName, fileExt);
    }

    public static List<Path> searchRegularFilesEndsWith(final Path initialPath, 
                             final String fileName, final String fileExt) throws IOException {
        return searchRegularFiles(initialPath, fileName + endsWithRegex, fileExt);
    }

    public static List<Path> searchRegularFilesAll(final Path initialPath) throws IOException {
        return searchRegularFiles(initialPath, "", "");
    }

    public static List<Path> searchRegularFiles(final Path initialPath,
                             final String fileName, final String fileExt)
            throws IOException {
        final String regex = String.format(containsRegex, fileName, fileExt);
        final Pattern pattern = Pattern.compile(regex);
        try (Stream<Path> walk = Files.walk(initialPath.toRealPath())) {
            return walk.filter(path -> Files.isRegularFile(path) &&
                                       pattern.matcher(path.toString()).find())
                    .collect(Collectors.toList());
        }
    }

    private PathUtils() {
    }
}

試行startsWith\ txt\temp\tempZERO0.txtの正規表現:

(?<![_ \-\p{L}\d\[\]\(\) ])temp(?:[^\/\\]*(?=((?i)\.txt(?!.))))

試行endsWith\ txt\temp\ZERO0temp.txtの正規表現:

temp(?=[\\.\\n])(?:[^\/\\]*(?=((?i)\.txt(?!.))))

試行に含まれる\ txt\temp\tempZERO0tempZERO0temp.txtの正規表現:

temp(?:[^\/\\]*(?=((?i)\.txt(?!.))))
0
Oleksandr