【问题标题】:Reading all the files in a folder recursively JavaJava递归读取文件夹中的所有文件
【发布时间】:2012-09-20 09:06:56
【问题描述】:

我需要编写一个程序从stdin读取文件夹路径及其所有子文件夹,然后根据扩展名打印出文件数。

会编译如下:

java Summary -r <path>

输出需要如下所示:

txt:
  number of files: 5
  combined size: 1202131
  largest file: 729224
  smallest file: 12323
pdf:
  number of files: 2
  etc...

有人可以帮我解决这个问题吗?我不知道如何处理它。

【问题讨论】:

  • 你用的是什么java版本?

标签: java inputstream filereader


【解决方案1】:

你可以从这样的东西开始递归地读取文件

public void listFilesForFolder(final File folder) {
    for (final File fileEntry : folder.listFiles()) {
        if (fileEntry.isDirectory()) {
            listFilesForFolder(fileEntry);
        } else {
            System.out.println(fileEntry.getName());
        }
    }
}

此代码由 @rich 提供。

其余的细节是你必须解决的。

您可以查看Read all files in a folder了解更多详情

【讨论】:

    【解决方案2】:

    看看这个:List files from directories and sub directories in java including only partial file paths

    您将获得目录下所有文件的列表,然后您可以使用file.length() 获取大小。

    【讨论】:

      【解决方案3】:

      与此代码类似的东西(来自http://www.javapractices.com/topic/TopicAction.do?Id=68):

      在 JDK 7 中:

      import java.io.IOException;
      import java.nio.file.FileVisitResult;
      import java.nio.file.FileVisitor;
      import java.nio.file.Files;
      import java.nio.file.Path;
      import java.nio.file.Paths;
      import java.nio.file.SimpleFileVisitor;
      import java.nio.file.attribute.BasicFileAttributes;
      
      /** Recursive listing with SimpleFileVisitor in JDK 7. */
      public final class FileListingVisitor {
      
        public static void main(String... aArgs) throws IOException{
          String ROOT = "C:\\test";
          FileVisitor<Path> fileProcessor = new ProcessFile();
          Files.walkFileTree(Paths.get(ROOT), fileProcessor);
        }
      
        private static final class ProcessFile extends SimpleFileVisitor<Path> {
          @Override public FileVisitResult visitFile(
            Path aFile, BasicFileAttributes aAttrs
          ) throws IOException {
            System.out.println("Processing file:" + aFile);
            return FileVisitResult.CONTINUE;
          }
      
          @Override  public FileVisitResult preVisitDirectory(
            Path aDir, BasicFileAttributes aAttrs
          ) throws IOException {
            System.out.println("Processing directory:" + aDir);
            return FileVisitResult.CONTINUE;
          }
        }
      } 
      

      在旧版本中:

      import java.util.*;
      import java.io.*;
      
      /**
      * Recursive file listing under a specified directory.
      *  
      * @author javapractices.com
      * @author Alex Wong
      * @author anonymous user
      */
      public final class FileListing {
      
        /**
        * Demonstrate use.
        * 
        * @param aArgs - <tt>aArgs[0]</tt> is the full name of an existing 
        * directory that can be read.
        */
        public static void main(String... aArgs) throws FileNotFoundException {
          File startingDirectory= new File(aArgs[0]);
          List<File> files = FileListing.getFileListing(startingDirectory);
      
          //print out all file names, in the the order of File.compareTo()
          for(File file : files ){
            System.out.println(file);
          }
        }
      
        /**
        * Recursively walk a directory tree and return a List of all
        * Files found; the List is sorted using File.compareTo().
        *
        * @param aStartingDir is a valid directory, which can be read.
        */
        static public List<File> getFileListing(
          File aStartingDir
        ) throws FileNotFoundException {
          validateDirectory(aStartingDir);
          List<File> result = getFileListingNoSort(aStartingDir);
          Collections.sort(result);
          return result;
        }
      
        // PRIVATE //
        static private List<File> getFileListingNoSort(
          File aStartingDir
        ) throws FileNotFoundException {
          List<File> result = new ArrayList<File>();
          File[] filesAndDirs = aStartingDir.listFiles();
          List<File> filesDirs = Arrays.asList(filesAndDirs);
          for(File file : filesDirs) {
            result.add(file); //always add, even if directory
            if ( ! file.isFile() ) {
              //must be a directory
              //recursive call!
              List<File> deeperList = getFileListingNoSort(file);
              result.addAll(deeperList);
            }
          }
          return result;
        }
      
        /**
        * Directory is valid if it exists, does not represent a file, and can be read.
        */
        static private void validateDirectory (
          File aDirectory
        ) throws FileNotFoundException {
          if (aDirectory == null) {
            throw new IllegalArgumentException("Directory should not be null.");
          }
          if (!aDirectory.exists()) {
            throw new FileNotFoundException("Directory does not exist: " + aDirectory);
          }
          if (!aDirectory.isDirectory()) {
            throw new IllegalArgumentException("Is not a directory: " + aDirectory);
          }
          if (!aDirectory.canRead()) {
            throw new IllegalArgumentException("Directory cannot be read: " + aDirectory);
          }
        }
      } 
      

      【讨论】:

        【解决方案4】:

        请使用以下代码。

        public static void listFiles(final File folder) {
            for (final File fileEntry : folder.listFiles()) {
                if (fileEntry.isFile() && fileEntry.getName().endsWith(".txt")) {
                    System.out.println(fileEntry.getName());
                }
            if (fileEntry.isFile() && fileEntry.getName().endsWith(".pdf")) {
                    System.out.println(fileEntry.getName());
                }
             else {
                    listFiles(fileEntry);
                }
            }
        }
        
        public static void main(String startingPath){
            File folder = new File(startingPath);
            listFiles(folder);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-20
          • 1970-01-01
          • 2011-01-13
          • 2017-03-09
          • 2013-05-15
          • 1970-01-01
          • 2019-07-15
          相关资源
          最近更新 更多