Recursively list files in Java

后端 未结 27 1403
走了就别回头了
走了就别回头了 2020-11-22 00:29

How do I recursively list all files under a directory in Java? Does the framework provide any utility?

I saw a lot of hacky implementations. But none from the fra

相关标签:
27条回答
  • 2020-11-22 00:37

    just write it yourself using simple recursion:

    public List<File> addFiles(List<File> files, File dir)
    {
        if (files == null)
            files = new LinkedList<File>();
    
        if (!dir.isDirectory())
        {
            files.add(dir);
            return files;
        }
    
        for (File file : dir.listFiles())
            addFiles(files, file);
        return files;
    }
    
    0 讨论(0)
  • 2020-11-22 00:40

    I prefer using a queue over recursion for this kind of simple traversion:

    List<File> allFiles = new ArrayList<File>();
    Queue<File> dirs = new LinkedList<File>();
    dirs.add(new File("/start/dir/"));
    while (!dirs.isEmpty()) {
      for (File f : dirs.poll().listFiles()) {
        if (f.isDirectory()) {
          dirs.add(f);
        } else if (f.isFile()) {
          allFiles.add(f);
        }
      }
    }
    
    0 讨论(0)
  • 2020-11-22 00:40

    This code is ready to run

    public static void main(String... args) {
        File[] files = new File("D:/").listFiles();
        if (files != null) 
           getFiles(files);
    }
    
    public static void getFiles(File[] files) {
        for (File file : files) {
            if (file.isDirectory()) {
                getFiles(file.listFiles());
            } else {
                System.out.println("File: " + file);
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-22 00:40

    Here a simple but perfectly working solution using recursion:

    public static List<Path> listFiles(String rootDirectory)
    {
        List<Path> files = new ArrayList<>();
        listFiles(rootDirectory, files);
    
        return files;
    }
    
    private static void listFiles(String path, List<Path> collectedFiles)
    {
        File root = new File(path);
        File[] files = root.listFiles();
    
        if (files == null)
        {
            return;
        }
    
        for (File file : files)
        {
            if (file.isDirectory())
            {
                listFiles(file.getAbsolutePath(), collectedFiles);
            } else
            {
                collectedFiles.add(file.toPath());
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-22 00:41

    You can use below code to get a list of files of specific folder or directory recursively.

    public static void main(String args[]) {
    
            recusiveList("D:");
    
        }
    
        public static void recursiveList(String path) {
    
            File f = new File(path);
            File[] fl = f.listFiles();
            for (int i = 0; i < fl.length; i++) {
                if (fl[i].isDirectory() && !fl[i].isHidden()) {
                    System.out.println(fl[i].getAbsolutePath());
                    recusiveList(fl[i].getAbsolutePath());
                } else {
                    System.out.println(fl[i].getName());
                }
            }
        }
    
    0 讨论(0)
  • 2020-11-22 00:41

    Based on stacker answer. Here is a solution working in JSP without any external libraries so you can put it almost anywhere on your server:

    <!DOCTYPE html>
    <%@ page session="false" %>
    <%@ page import="java.util.*" %>
    <%@ page import="java.io.*" %>
    <%@ page contentType="text/html; charset=UTF-8" %>
    
    <%!
        public List<String> files = new ArrayList<String>();
        /**
            Fills files array with all sub-files.
        */
        public void walk( File root ) {
            File[] list = root.listFiles();
    
            if (list == null) return;
    
            for ( File f : list ) {
                if ( f.isDirectory() ) {
                    walk( f );
                }
                else {
                    files.add(f.getAbsolutePath());
                }
            }
        }
    %>
    <%
        files.clear();
        File jsp = new File(request.getRealPath(request.getServletPath()));
        File dir = jsp.getParentFile();
        walk(dir);
        String prefixPath = dir.getAbsolutePath() + "/";
    %>
    

    Then you just do something like:

        <ul>
            <% for (String file : files) { %>
                <% if (file.matches(".+\\.(apk|ipa|mobileprovision)")) { %>
                    <li><%=file.replace(prefixPath, "")%></li>
                <% } %>
            <% } %>
        </ul>
    
    0 讨论(0)
提交回复
热议问题