java 递归读取文件夹中的所有文件Java

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/12509406/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 09:10:27  来源:igfitidea点击:

Reading all the files in a folder recursively Java

javainputstreamfilereader

提问by SNpn

I need to write a program to read folder path from stdinand all it's subfolders and then print out the number of files according to their extension.

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

it will be compiled as follows:

它将被编译如下:

java Summary -r <path>

java Summary -r <path>

the output needs to look like:

输出需要如下所示:

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

can someone please help me with this? I'm not sure how to approach it.

有人可以帮我吗?我不知道如何处理它。

回答by MaVRoSCy

you can start with something like this for reading files recursively

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

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

This code is by @rich.

此代码由@rich 提供。

The rest of the details is something that you have to work out.

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

You can see Read all files in a folderfor more details

您可以查看读取文件夹中的所有文件以获取更多详细信息

回答by Osiris

Take a look at this: List files from directories and sub directories in java including only partial file paths

看看这个:List files from directorys and subdirectories in java包括仅部分文件路径

You'll get a list of all files under your directory, and then you can use file.length()to get the size.

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

回答by zacheusz

something simillar to this code (from http://www.javapractices.com/topic/TopicAction.do?Id=68):

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

in JDK 7:

在 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;
    }
  }
} 

in older:

在较旧的:

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);
    }
  }
} 

回答by Prasad De Silva

Please use the following piece of code.

请使用以下代码。

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);
}