Javaからフォルダ内のすべてのファイルを読み取る方法は?

2009年12月04日に質問されました。  ·  閲覧回数 1.1M回  ·  ソース

M.J. picture
2009年12月04日

Javaを介してフォルダ内のすべてのファイルを読み取る方法は?

回答

rich picture
2009年12月04日
1019
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.walkAPI

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

この例では、APIガイドで推奨されているtry-with-resourcesパターンを使用しています。 これにより、どのような状況でもストリームが閉じられます。

David Robles picture
2009年12月04日
186
File folder = new File("/Users/you/folder/");
File[] listOfFiles = folder.listFiles();

for (File file : listOfFiles) {
    if (file.isFile()) {
        System.out.println(file.getName());
    }
}
Julian Pieles picture
2014年10月06日
135

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>を返したい場合は、マップしてください。

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

また、ストリームを必ず閉じる必要があります。 そうしないと、開いているファイルが多すぎるという例外が発生する可能性があります。 詳細については、こちらをお読みください。

Martin picture
2015年12月04日
30

新しいJava8関数を利用するこのトピックに関するすべての回答は、ストリームを閉じることを怠っています。 受け入れられた回答の例は次のとおりです。

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から:

返されるストリームは、1つ以上のDirectoryStreamをカプセル化します。 ファイルシステムリソースをタイムリーに破棄する必要がある場合は、try-with-resources構造を使用して、ストリーム操作の完了後にストリームのcloseメソッドが呼び出されるようにする必要があります。

xxxception picture
2019年01月30日
16

ディレクトリ内のすべてのファイルを取得するための1つのコメント。
メソッドFiles.walk(path)は、指定された開始ファイルをルートとするファイルツリーをたどることにより、すべてのファイルを返します。

たとえば、次のファイルツリーがあります。

\---folder
    |   file1.txt
    |   file2.txt
    |
    \---subfolder
            file3.txt
            file4.txt

java.nio.file.Files.walk(Path)

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

次の結果が得られます。

folder\file1.txt
folder\file2.txt
folder\subfolder\file3.txt
folder\subfolder\file4.txt

現在のディレクトリにあるすべてのファイルのみを取得するには、 java.nio.file.Files.list(Path)ます。

Files.list(Paths.get("folder"))
        .filter(Files::isRegularFile)
        .forEach(System.out::println);

結果:

folder\file1.txt
folder\file2.txt
muthu krishna picture
2012年11月23日
12
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());
        }

      }
    }
  }
}
Sanket Thakkar picture
2013年08月05日
11
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
    }
}
Mark Spangler picture
2013年08月16日
11

Java 7以降では、 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

micha picture
2014年05月23日
7

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;
    }
});
Adrien Hadj-Salah picture
2013年05月15日
5

より多くのオプションが必要な場合は、フォルダーに存在するファイルの配列リストにデータを入力することを目的としたこの関数を使用できます。 オプションは次のとおりです。一致する再帰性とパターン。

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

最高、エイドリアン