首页 文章

如何从Java读取文件夹中的所有文件?

提问于
浏览
538

如何通过Java读取文件夹中的所有文件?

29 回答

  • 3
    package com;
    
    
    import java.io.File;
    
    /**
     *
     * @author ?Mukesh
     */
    public class ListFiles {
    
         static File mainFolder = new File("D:\\Movies");
    
         public static void main(String[] args)
         {
             ListFiles lf = new ListFiles();
             lf.getFiles(lf.mainFolder);
    
             long fileSize = mainFolder.length();
                 System.out.println("mainFolder size in bytes is: " + fileSize);
                 System.out.println("File size in KB is : " + (double)fileSize/1024);
                 System.out.println("File size in MB is :" + (double)fileSize/(1024*1024));
         }
         public void getFiles(File f){
             File files[];
             if(f.isFile())
                 System.out.println(f.getAbsolutePath());
             else{
                 files = f.listFiles();
                 for (int i = 0; i < files.length; i++) {
                     getFiles(files[i]);
                 }
             }
         }
    }
    
  • 97
    /**
     * Function to read all mp3 files from sdcard and store the details in an
     * ArrayList
     */
    
    
    public ArrayList<HashMap<String, String>> getPlayList() 
        {
            ArrayList<HashMap<String, String>> songsList=new ArrayList<>();
            File home = new File(MEDIA_PATH);
    
            if (home.listFiles(new FileExtensionFilter()).length > 0) {
                for (File file : home.listFiles(new FileExtensionFilter())) {
                    HashMap<String, String> song = new HashMap<String, String>();
                    song.put(
                            "songTitle",
                            file.getName().substring(0,
                                    (file.getName().length() - 4)));
                    song.put("songPath", file.getPath());
    
                    // Adding each song to SongList
                    songsList.add(song);
                }
            }
            // return songs list array
            return songsList;
        }
    
        /**
         * Class to filter files which have a .mp3 extension
         * */
        class FileExtensionFilter implements FilenameFilter 
        {
            @Override
            public boolean accept(File dir, String name) {
                return (name.endsWith(".mp3") || name.endsWith(".MP3"));
            }
        }
    

    您可以过滤任何文本文件或任何其他扩展名 . 只需用.MP3替换它

  • 2

    我认为这是阅读文件夹和子文件夹中所有文件的好方法

    private static void addfiles (File input,ArrayList<File> files)
    {
        if(input.isDirectory())
        {
            ArrayList <File> path = new ArrayList<File>(Arrays.asList(input.listFiles()));
            for(int i=0 ; i<path.size();++i)
            {
                if(path.get(i).isDirectory())
                {
                    addfiles(path.get(i),files);
                }
                if(path.get(i).isFile())
                {
                    files.add(path.get(i));
                }
            }
        }
        if(input.isFile())
        {
            files.add(input);
        }
    }
    
  • 6
    package com.commandline.folder;
    
    import java.io.File;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.util.stream.Stream;
    
    public class FolderReadingDemo {
        public static void main(String[] args) {
            String str = args[0];
            final File folder = new File(str);
    //      listFilesForFolder(folder);
            listFilesForFolder(str);
        }
    
        public static void listFilesForFolder(String str) {
            try (Stream<Path> paths = Files.walk(Paths.get(str))) {
                paths.filter(Files::isRegularFile).forEach(System.out::println);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static void listFilesForFolder(final File folder) {
            for (final File fileEntry : folder.listFiles()) {
                if (fileEntry.isDirectory()) {
                    listFilesForFolder(fileEntry);
                } else {
                    System.out.println(fileEntry.getName());
                }
            }
        }
    
    }
    
  • 0

    关于此主题的所有使用新Java 8函数的答案都忽略了关闭流 . 接受的答案中的例子应该是:

    try (Stream<Path> filePathStream=Files.walk(Paths.get("/home/you/Desktop"))) {
        filePathStream.forEach(filePath -> {
            if (Files.isRegularFile(filePath)) {
                System.out.println(filePath);
            }
        });
    }
    

    Files.walk 方法的javadoc:

    返回的流封装了一个或多个DirectoryStream . 如果需要及时处理文件系统资源,则应使用try-with-resources构造来确保在流操作完成后调用流的close方法 .

  • -1
    import java.io.File;
    
    
    public class ReadFilesFromFolder {
      public static File folder = new File("C:/Documents and Settings/My Documents/Downloads");
      static String temp = "";
    
      public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("Reading files under the folder "+ folder.getAbsolutePath());
        listFilesForFolder(folder);
      }
    
      public static void listFilesForFolder(final File folder) {
    
        for (final File fileEntry : folder.listFiles()) {
          if (fileEntry.isDirectory()) {
            // System.out.println("Reading files under the folder "+folder.getAbsolutePath());
            listFilesForFolder(fileEntry);
          } else {
            if (fileEntry.isFile()) {
              temp = fileEntry.getName();
              if ((temp.substring(temp.lastIndexOf('.') + 1, temp.length()).toLowerCase()).equals("txt"))
                System.out.println("File= " + folder.getAbsolutePath()+ "\\" + fileEntry.getName());
            }
    
          }
        }
      }
    }
    
  • 10
    public void listFilesForFolder(final File folder) {
        for (final File fileEntry : folder.listFiles()) {
            if (fileEntry.isDirectory()) {
                listFilesForFolder(fileEntry);
            } else {
                System.out.println(fileEntry.getName());
            }
        }
    }
    
    final File folder = new File("/home/you/Desktop");
    listFilesForFolder(folder);
    

    Files.walk API可从Java 8获得 .

    try (Stream<Path> paths = Files.walk(Paths.get("/home/you/Desktop"))) {
        paths
            .filter(Files::isRegularFile)
            .forEach(System.out::println);
    }
    

    该示例使用API指南中推荐的try-with-resources模式 . 它确保无论何种情况都将关闭流 .

  • 816

    这样可以正常工作:

    private static void addfiles(File inputValVal, ArrayList<File> files)
    {
      if(inputVal.isDirectory())
      {
        ArrayList <File> path = new ArrayList<File>(Arrays.asList(inputVal.listFiles()));
    
        for(int i=0; i<path.size(); ++i)
        {
            if(path.get(i).isDirectory())
            {
                addfiles(path.get(i),files);
            }
            if(path.get(i).isFile())
            {
                files.add(path.get(i));
            }
         }
    
        /*  Optional : if you need to have the counts of all the folders and files you can create 2 global arrays 
            and store the results of the above 2 if loops inside these arrays */
       }
    
       if(inputVal.isFile())
       {
         files.add(inputVal);
       }
    
    }
    
  • 141

    如果您想要更多选项,可以使用此功能,该功能旨在填充文件夹中存在的文件的arraylist . 选项包括:recursivility和要匹配的模式 .

    public static ArrayList<File> listFilesForFolder(final File folder,
            final boolean recursivity,
            final String patternFileFilter) {
    
        // Inputs
        boolean filteredFile = false;
    
        // Ouput
        final ArrayList<File> output = new ArrayList<File> ();
    
        // Foreach elements
        for (final File fileEntry : folder.listFiles()) {
    
            // If this element is a directory, do it recursivly
            if (fileEntry.isDirectory()) {
                if (recursivity) {
                    output.addAll(listFilesForFolder(fileEntry, recursivity, patternFileFilter));
                }
            }
            else {
                // If there is no pattern, the file is correct
                if (patternFileFilter.length() == 0) {
                    filteredFile = true;
                }
                // Otherwise we need to filter by pattern
                else {
                    filteredFile = Pattern.matches(patternFileFilter, fileEntry.getName());
                }
    
                // If the file has a name which match with the pattern, then add it to the list
                if (filteredFile) {
                    output.add(fileEntry);
                }
            }
        }
    
        return output;
    }
    

    最好的,阿德里安

  • 9
    void getFiles(){
            String dirPath = "E:/folder_name";
            File dir = new File(dirPath);
            String[] files = dir.list();
            if (files.length == 0) {
                System.out.println("The directory is empty");
            } else {
                for (String aFile : files) {
                    System.out.println(aFile);
                }
            }
        }
    
  • 5
    File folder = new File("/Users/you/folder/");
    File[] listOfFiles = folder.listFiles();
    
    for (File file : listOfFiles) {
        if (file.isFile()) {
            System.out.println(file.getName());
        }
    }
    
  • 0

    您可以将文件路径放入参数并创建包含所有文件路径的列表,而不是手动将其放在列表中 . 然后使用for循环和阅读器 . txt文件示例:

    public static void main(String[] args) throws IOException{    
    File[] files = new File(args[0].replace("\\", "\\\\")).listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith(".txt"); } });
        ArrayList<String> filedir = new ArrayList<String>();
        String FILE_TEST = null;
        for (i=0; i<files.length; i++){
                filedir.add(files[i].toString());
                CSV_FILE_TEST=filedir.get(i) 
    
            try(Reader testreader = Files.newBufferedReader(Paths.get(FILE_TEST));
                ){
                  //write your stuff
                     }}}
    
  • 0

    https://stackoverflow.com/a/286001/146745上看到 java.io.FileFilter 的很好用法

    File fl = new File(dir);
    File[] files = fl.listFiles(new FileFilter() {          
        public boolean accept(File file) {
            return file.isFile();
        }
    });
    
  • 3

    虽然我同意Rich,Orian和其他人使用:

    final File keysFileFolder = new File(<path>); 
        File[] fileslist = keysFileFolder.listFiles();
    
        if(fileslist != null)
        {
            //Do your thing here...
        }
    

    出于某种原因,这里的所有示例都使用 absolute 路径(即从root用户,或者说,驱动器号(C:\)用于Windows ..)

    我想补充一点,也可以使用 relative 路径 . 所以,如果你是pwd(当前目录/文件夹)是folder1并且你想要解析folder1 /子文件夹,你只需编写(在上面的代码而不是):

    final File keysFileFolder = new File("subfolder");
    
  • 0

    Java 8 Files.walk(..) 很好,当你感到厌倦它不会抛出Avoid Java 8 Files.walk(..) termination cause of ( java.nio.file.AccessDeniedException ) .

    这是一个安全的解决方案,虽然不如Java 8 Files.walk(..) 那么优雅:

    int[] count = {0};
    try {
        Files.walkFileTree(Paths.get(dir.getPath()), new HashSet<FileVisitOption>(Arrays.asList(FileVisitOption.FOLLOW_LINKS)),
                Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
                    @Override
                    public FileVisitResult visitFile(Path file , BasicFileAttributes attrs) throws IOException {
                        System.out.printf("Visiting file %s\n", file);
                        ++count[0];
    
                        return FileVisitResult.CONTINUE;
                    }
    
                    @Override
                    public FileVisitResult visitFileFailed(Path file , IOException e) throws IOException {
                        System.err.printf("Visiting failed for %s\n", file);
    
                        return FileVisitResult.SKIP_SUBTREE;
                    }
    
                    @Override
                    public FileVisitResult preVisitDirectory(Path dir , BasicFileAttributes attrs) throws IOException {
                         System.out.printf("About to visit directory %s\n", dir);
                        return FileVisitResult.CONTINUE;
                    }
                });
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
  • 0

    防止listFiles()函数上的Nullpointerexceptions并递归获取子目录中的所有文件..

    public void listFilesForFolder(final File folder,List<File> fileList) {
        File[] filesInFolder = folder.listFiles();
        if (filesInFolder != null) {
            for (final File fileEntry : filesInFolder) {
                if (fileEntry.isDirectory()) {
                listFilesForFolder(fileEntry,fileList);
            } else {
                fileList.add(fileEntry);
            }
         }
        }
     }
    
     List<File> fileList = new List<File>();
     final File folder = new File("/home/you/Desktop");
     listFilesForFolder(folder);
    
  • 0
    File directory = new File("/user/folder");      
    File[] myarray;  
    myarray=new File[10];
    myarray=directory.listFiles();
    for (int j = 0; j < myarray.length; j++)
    {
           File path=myarray[j];
           FileReader fr = new FileReader(path);
           BufferedReader br = new BufferedReader(fr);
           String s = "";
           while (br.ready()) {
              s += br.readLine() + "\n";
           }
    }
    
  • 0
    private static final String ROOT_FILE_PATH="/";
    File f=new File(ROOT_FILE_PATH);
    File[] allSubFiles=f.listFiles();
    for (File file : allSubFiles) {
        if(file.isDirectory())
        {
            System.out.println(file.getAbsolutePath()+" is directory");
            //Steps for directory
        }
        else
        {
            System.out.println(file.getAbsolutePath()+" is file");
            //steps for files
        }
    }
    
  • 7

    为了扩展已接受的答案,我将文件名存储到ArrayList(而不是将它们转储到System.out.println)我创建了一个帮助类“MyFileUtils”,因此它可以被其他项目导入:

    class MyFileUtils {
        public static void loadFilesForFolder(final File folder, List<String> fileList){
            for (final File fileEntry : folder.listFiles()) {
                if (fileEntry.isDirectory()) {
                    loadFilesForFolder(fileEntry, fileList);
                } else {
                    fileList.add( fileEntry.getParent() + File.separator + fileEntry.getName() );
                }
            }
        }
    }
    

    我添加了文件名的完整路径 . 你会像这样使用它:

    import MyFileUtils;
    
    List<String> fileList = new ArrayList<String>();
    final File folder = new File("/home/you/Desktop");
    MyFileUtils.loadFilesForFolder(folder, fileList);
    
    // Dump file list values
    for (String fileName : fileList){
        System.out.println(fileName);
    }
    

    ArrayList由“value”传递,但该值用于指向生活在JVM堆中的相同ArrayList对象 . 这样,每个递归调用都会将文件名添加到同一个ArrayList中(我们不会在每次递归调用时创建新的ArrayList) .

  • 3

    上面有很多好的答案,这里有一个不同的方法:在maven项目中,您放在resources文件夹中的所有内容都默认复制到target / classes文件夹中 . 查看运行时可用的内容

    ClassLoader contextClassLoader = 
     Thread.currentThread().getContextClassLoader();
        URL resource = contextClassLoader.getResource("");
        File file = new File(resource.toURI());
        File[] files = file.listFiles();
        for (File f : files) {
            System.out.println(f.getName());
        }
    

    现在要从特定文件夹中获取文件,假设您在资源文件夹中有一个名为“res”的文件夹,只需替换:

    URL resource = contextClassLoader.getResource("res");
    

    如果您想要在com.companyName包中访问,那么:

    contextClassLoader.getResource("com.companyName");
    
  • 2

    在Java 7中,您现在可以这样做 - http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#listdir

    Path dir = ...;
    try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
        for (Path file: stream) {
            System.out.println(file.getFileName());
        }
    } catch (IOException | DirectoryIteratorException x) {
        // IOException can never be thrown by the iteration.
        // In this snippet, it can only be thrown by newDirectoryStream.
        System.err.println(x);
    }
    

    您还可以创建一个过滤器,然后将其传递给上面的 newDirectoryStream 方法

    DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {
        public boolean accept(Path file) throws IOException {
            try {
                return (Files.isRegularFile(path));
            } catch (IOException x) {
                // Failed to determine if it's a file.
                System.err.println(x);
                return false;
            }
        }
    };
    

    其他过滤示例 - http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#glob

  • 2

    只需使用 Files.walkFileTree (Java 7)浏览所有文件

    Files.walkFileTree(Paths.get(dir), new SimpleFileVisitor<Path>() {
        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
            System.out.println("file: " + file);
            return FileVisitResult.CONTINUE;
        }
    });
    
  • -2

    列出类路径中存在的Test文件夹中的文件

    import java.io.File;
    import java.io.IOException;
    
    public class Hello {
    
        public static void main(final String[] args) throws IOException {
    
            System.out.println("List down all the files present on the server directory");
            File file1 = new File("/prog/FileTest/src/Test");
            File[] files = file1.listFiles();
            if (null != files) {
                for (int fileIntList = 0; fileIntList < files.length; fileIntList++) {
                    String ss = files[fileIntList].toString();
                    if (null != ss && ss.length() > 0) {
                        System.out.println("File: " + (fileIntList + 1) + " :" + ss.substring(ss.lastIndexOf("\\") + 1, ss.length()));
                    }
                }
            }
    
    
        }
    
    
    }
    
  • 3
    import java.io.File;
    import java.util.ArrayList;
    import java.util.List;
    
    public class AvoidNullExp {
    
    public static void main(String[] args) {
    
        List<File> fileList =new ArrayList<>();
         final File folder = new File("g:/master");
         new AvoidNullExp().listFilesForFolder(folder, fileList);
    }
    
        public void listFilesForFolder(final File folder,List<File> fileList) {
            File[] filesInFolder = folder.listFiles();
            if (filesInFolder != null) {
                for (final File fileEntry : filesInFolder) {
                    if (fileEntry.isDirectory()) {
                        System.out.println("DIR : "+fileEntry.getName());
                    listFilesForFolder(fileEntry,fileList);
                } else {
                    System.out.println("FILE : "+fileEntry.getName());
                    fileList.add(fileEntry);
                }
             }
            }
         }
    
    
    }
    
  • 19

    在Java 8中,您可以执行此操作

    Files.walk(Paths.get("/path/to/folder"))
         .filter(Files::isRegularFile)
         .forEach(System.out::println);
    

    这将打印文件夹中的所有文件,同时排除所有目录 . 如果您需要一个列表,以下内容将:

    Files.walk(Paths.get("/path/to/folder"))
         .filter(Files::isRegularFile)
         .collect(Collectors.toList())
    

    如果你想返回 List<File> 而不是 List<Path> 只是映射它:

    List<File> filesInFolder = Files.walk(Paths.get("/path/to/folder"))
                                    .filter(Files::isRegularFile)
                                    .map(Path::toFile)
                                    .collect(Collectors.toList());
    

    您还需要确保关闭流!否则,您可能会遇到一个异常,告诉您打开了太多文件 . 有关更多信息,请阅读here .

  • 0

    与Java 1.7一起使用的简单示例,以递归方式列出命令行中指定的目录中的文件:

    import java.io.File;
    
    public class List {
        public static void main(String[] args) {
            for (String f : args) {
                listDir(f);
            }
        }
    
        private static void listDir(String dir) {
            File f = new File(dir);
            File[] list = f.listFiles();
    
            if (list == null) {
                return;
            }
    
            for (File entry : list) {
                System.out.println(entry.getName());
                if (entry.isDirectory()) {
                    listDir(entry.getAbsolutePath());
                }
            }
        }
    }
    
  • 0
    import java.io.File;
    
    
    public class Test {
    
    public void test1() {
        System.out.println("TEST 1");
    }
    
    public static void main(String[] args) throws SecurityException, ClassNotFoundException{
    
        File actual = new File("src");
        File list[] = actual.listFiles();
        for(int i=0; i<list.length; i++){
            String substring = list[i].getName().substring(0, list[i].getName().indexOf("."));
            if(list[i].isFile() && list[i].getName().contains(".java")){
                    if(Class.forName(substring).getMethods()[0].getName().contains("main")){
                        System.out.println("CLASS NAME "+Class.forName(substring).getName());
                    }
    
             }
        }
    
    }
    }
    

    只需通过您的文件夹,它将告诉您关于该方法的主类 .

  • 3
    static File mainFolder = new File("Folder");
        public static void main(String[] args) {
    
            lf.getFiles(lf.mainFolder);
        }
        public void getFiles(File f) {
            File files[];
            if (f.isFile()) {
                String name=f.getName();
    
            } else {
                files = f.listFiles();
                for (int i = 0; i < files.length; i++) {
                    getFiles(files[i]);
                }
            }
        }
    
  • 0

    这将在给定路径中读取指定的文件扩展名文件(也查看子文件夹)

    public static Map<String,List<File>> getFileNames(String 
    dirName,Map<String,List<File>> filesContainer,final String fileExt){
        String dirPath = dirName;
        List<File>files = new ArrayList<>();
        Map<String,List<File>> completeFiles = filesContainer; 
        if(completeFiles == null) {
            completeFiles = new HashMap<>();
        }
        File file = new File(dirName);
    
        FileFilter fileFilter = new FileFilter() {
            @Override
            public boolean accept(File file) {
                boolean acceptFile = false;
                if(file.isDirectory()) {
                    acceptFile = true;
                }else if (file.getName().toLowerCase().endsWith(fileExt))
                  {
                    acceptFile = true;
                  }
                return acceptFile;
            }
        };
        for(File dirfile : file.listFiles(fileFilter)) {
            if(dirfile.isFile() && 
    dirfile.getName().toLowerCase().endsWith(fileExt)) {
                files.add(dirfile);
            }else if(dirfile.isDirectory()) {
                if(!files.isEmpty()) {
                    completeFiles.put(dirPath, files);  
                }
    
    getFileNames(dirfile.getAbsolutePath(),completeFiles,fileExt);
            }
        }
        if(!files.isEmpty()) {
            completeFiles.put(dirPath, files);  
        }
        return completeFiles;
    }
    

相关问题