【问题标题】:How to list all files within a directory and all its sub-directories如何列出目录及其所有子目录中的所有文件
【发布时间】:2014-03-08 09:30:45
【问题描述】:

我制作了一个程序,列出了您选择的扩展名目录中的所有文件名。现在我想而且我不知道如何更改它以列出子目录中的所有文件。你有什么想法?这是我的代码。谢谢!

import java.util.*;
import java.io.*;

public class Program {

    public static void main(String str[]){
        try{
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("1.Enter directory name:");
            String adress = br.readLine();
            System.out.println("2.Enter file extension:");
            String exten = br.readLine();

            File directory = new File(adress);

            File[] f = directory.listFiles();     

            List<String> files = new ArrayList<String>();
            List<String> valid = new ArrayList<String>();
            List<String> names = new ArrayList<String>();

            for(int i=0; i < f.length; i++){
                if(f[i].isFile()){
                    files.add(f[i].getName());
                }
            }

            for(int i=0; i < files.size(); i++){
                if (files.get(i).endsWith(exten)){
                    valid.add(files.get(i));
                }
            }

            for(int i=0; i < valid.size(); i++){
                int pos = valid.get(i).lastIndexOf(".");
                    names.add(valid.get(i).substring(0, pos));
                    System.out.println(names.get(i));
            }
       }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}

【问题讨论】:

  • 您使用的是什么版本的 Java?在 Java 7 中,您可以使用 FileVisitor,在 Java 8 中,有一个内置方法,您可以将所有代码写成两行。
  • 阅读递归,因为这是您想要使用的。您需要创建自己的方法,而不仅仅是使用 main 方法。
  • 请学习使用增强的 for 循环。您应该正确使用File API,使用FileFilter 会对您有所帮助。至于你的主要问题 - 你需要递归。
  • 谢谢大家的回复。我最近才开始学习 JAVA,所以我不知道增强循环。从现在开始使用,谢谢!

标签: java list directory


【解决方案1】:

如果您可以使用 Java 7 或 8,则可以使用 FileVisitor,但在 Java 7 中,这意味着编写不止一行代码。如果不是,并且您想保持简单,Apache Commons FileUtils 可能是您的朋友。

Collection<File> files = FileUtils.listFiles(path, new String[]{"xlxs"}, true);

【讨论】:

  • Files.walk(Paths.get(".")).filter((path) -&gt; path.toString().endsWith(".java")).forEach(System.out::println); 是我数的一行。
  • 是的,我同意,它是 Java 8 的一个非常好的示例!更新了我的答案。
【解决方案2】:

我做了一段时间后在一个目录中找到所有 *.xls 或 *.xlsx。

希望这对您的问题有所帮助。

public static List<String> fileSearch(String d){
        List<String> filesFound = new ArrayList<String>();
        File dir = new File(d);
        try{
        for(File file: dir.listFiles()){
            if(file.isFile() && (file.getName().toLowerCase().endsWith(".xlsx") || file.getName().toLowerCase().endsWith(".xls"))){

                long filesize = file.length();
                long fileSize = filesize / 1024;

                filesFound.add(d + "\\" + file.getName());
                System.out.println("Added: " + d + "\\" + file.getName()  + "     " + fileSize + " KB" );
            }else if(file.isDirectory() && !file.isHidden()){
                System.out.println("Found Directory: " + file.getName());
                filesFound.addAll(fileSearch(d + "\\" + file.getName()));
            }else if(isRoot(file)){
                        //DO NOTHING
            }
        }

        }catch(NullPointerException ex){
            ex.printStackTrace();
        }finally{
            return filesFound;
        }
    }

private static boolean isRoot(File file){
        File[] roots = File.listRoots();

        for (File root : roots) {
            if (file.equals(root)) {
            return true;
            }
        }

        return false;
    }

这是做什么的,它将搜索每个文件以查找匹配项,如果匹配,则将其添加到数组“filesFound”中,从那里您可以获得匹配文件的所有路径。但是对你来说,你会取出 .xlsx 和 .xls 部分并添加到你的分机中。

fileSearch(String d, String ext)

并将 if then 更改为:

if(file.isFile() && file.getName().toLowerCase().endsWith(ext))

当它找到与它旁边的文件大小匹配时,我也让它输出。文件大小只是一种视觉帮助,不会包含在数组中。

【讨论】:

  • 这是非常过时的,不仅有点乱。查看其他建议的解决方案。
  • 可能会很乱,我在一年前完成了它,并且完全按照我想要它做的事情以及他想要做的事情......这只是稍微调整了一下。它会遍历它找到的每个文件夹以及目录中的每个文件等等。但那时我对文件系统的了解有限
  • Java 7 已发布2011-07-28。对不起,可是;这没有任何借口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
  • 2016-08-07
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
相关资源
最近更新 更多