Java에서 폴더의 모든 파일을 읽는 방법은 무엇입니까?


669

Java를 통해 폴더의 모든 파일을 읽는 방법은 무엇입니까?


8
포스터가 다양한 방법에 익숙해 지도록 클래스를 사용하도록 지적하십시오. 그렇지 않으면 포스터는 API를 읽고 다른 방법을 사용할 수 있는지 확인하지 않아도됩니다.
camickr

5
폴더의 모든 파일 또는 폴더와 모든 하위 폴더의 모든 파일을 의미 했습니까?
Jim Garrison


2
Java 7 이상을 사용하는 경우 사용할 수 있습니다 Files.walkFileTree. stackoverflow.com/a/23814217/1115554
micha

답변:


977
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 안내서에서 권장하는 자원 사용 가능 패턴을 사용합니다. 상황에 관계없이 스트림이 닫히도록합니다.


10
getName()디렉토리의 파일 이름 만 제공합니다. 원본의 하위 디렉토리 일 수 있습니다. 이 정보를 사용하여 파일을 찾으려면 제공된 경로 getPath()가 더 유용 할 수 있습니다.
Tim Parenti

4
이 방법을 사용하여 전체 시스템에서 pdf 또는 html과 같은 특정 유형의 모든 파일을 찾을 수 있습니까? 내 관심사는 효율성입니다. 수천 개의 파일이있는 시스템에 사용하기에 충분히 빠르거나 더 나은 대안이 있습니까?
Nitin Labhishetty 2015 년

@codeln Java 8부터는 성능이 매우 뛰어나므로 게으른 아무것도 눈치 채지 못합니다. 작업을 완료 할 수있을만큼 빠르고 효율적이며 읽을 수 있습니다.
tom_mai78101

17
Java 8에서는 filter메소드를 사용할 수도 있습니다 . 그런 다음 forEach는 더 이상 필요하지 않습니다. 여기를 참조하십시오 -> stackoverflow.com/a/26215931/1029251
줄리안 Pieles

3
한 번만 초기화되었음을 나타냅니다.
rich

176
File folder = new File("/Users/you/folder/");
File[] listOfFiles = folder.listFiles();

for (File file : listOfFiles) {
    if (file.isFile()) {
        System.out.println(file.getName());
    }
}

2
나는이 디렉토리 이름을 인쇄합니다 생각하고, 어떤 파일 이름없는
Fortega

1
허용 된 답변보다 이해하기 훨씬 쉽습니다. +1.
sam1370

129

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

또한 스트림을 닫아야합니다! 그렇지 않으면 너무 많은 파일이 열려 있음을 알리는 예외가 발생할 수 있습니다. 자세한 내용은 여기 를 읽으 십시오 .


3
.map (Path :: toFile) 오류 발생하기 .forEach (path-> System.out.println (path.toString ()); .forEach (path-> System.out.println (path.toString () )));
XaolingBao

2
"잘못된 메소드 참조, 기호를 찾을 수 없음"이라고 표시됩니다. "Method toFile"은 toFile이 다른 것으로 가정합니까?
XaolingBao

2
PasteBin에 코드를 붙여 넣을 수 있습니까? 사용하고 java.nio.file.Path있습니까? 방금 java 8-> docs.oracle.com/javase/7/docs/api/java/nio/file/
Julian Pieles

2
@NadjibMami 여기를보십시오 : razem.io/blog/posts/year2015/0819_try_catch_lambda 코멘트에 답변하기 위해 컴파일 되었습니다. 그래서 나는 빠른 블로그 게시물을 썼습니다.
Julian Pieles

2
누군가가 try catch lambda 주제를 여전히 찾고 있다면 내 블로그의 URL이 변경되었습니다-> razem.io/blog/y2015/0819_try_catch_lambda.html
Julian Pieles 10

26

새로운 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을 캡슐화합니다. 파일 시스템 자원을 적시에 폐기해야하는 경우, 스트림 조작이 완료된 후 스트림의 close 메소드가 호출되도록 try-with-resources 구문을 사용해야합니다.


Stream을 반복해서는 안됩니다. Stream 참조를 가져 와서 사용하십시오.
루돌프 슈미트

@RudolfSchmidt "버린다"라는 뜻입니까?
Roland

1
올바른 방법은 다음과 같이 사용하는 것입니다. Files.walk (Paths.get ( "/ home / you / Desktop")). filter (Files :: isRegularFile) .forEach (filePath-> ...)
루돌프 슈미트

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

      }
    }
  }
}

6
에 오신 것을 환영합니다 ! 코드 블록 만 게시하는 대신 이 코드로 인해 문제가 해결 된 이유 를 설명 하십시오 . 설명이 없으면 대답이 아닙니다.
Martijn Pieters

동의, 그냥 코드 블록을 게시하면 작동하지 않습니다 코드에 몇 가지 코멘트를 추가하십시오 ...
Ashraf.Shk786

이것은 좋은 코드이며 폴더의 하위 디렉토리에있는 파일도 읽을 수 있습니다.
Mimouni

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

이것은 안드로이드가 SD 카드 또는 내부 저장소에서 모든 파일과 폴더를 읽는 솔루션입니다.
Sanket Thakkar 2016 년

10

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 )


필터 만들기 예제에 혼란 스럽습니다. newDirectoryStream.Filter <Path> 란 무엇입니까? 그것이 어떻게 선언되는지 보여줄 수 있습니까?
simgineer 2011

내가 알아 낸 것 같아 그것의 사본 및 붙여 넣기 오타. "new"와 "DirectoryStream.Filter ..."사이에 공백이 있습니다. 내가 옳다면 예제를 수정하는 것이 좋습니다.
simgineer 2011

9

디렉토리의 모든 파일을 가져 오는 한 가지 언급.
이 메소드 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

이것은 2020 년에 현재 질문에 남은 유일한 답이어야합니다. :)
Haramoz

Files.list예를 들어 공감하십시오 . 재귀 적으로 검색 하지 않으려 경우 때때로 최선의 옵션이 될 수 있습니다.
Per Lundberg

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

일부 파일 또는 디렉토리의 경우 파일 속성을 읽을 수없는 경우 (예 : 권한으로 인해) 이 코드는 예외 ( 더 이상 파일을보고하지 않음 )를 발생시킵니다. `C :`에서 쉽게 재현 할 수 있습니다.
Thomas S.

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

최고, Adrien


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

1
코드 만 표시하는 대신 달성하려는 내용에 대한 설명을 추가 할 수 있습니다. 또한 myarray=new File[10];다음 줄로 덮어 쓰므로 필요하지 않습니다!
Veger


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

3

폴더와 하위 폴더의 모든 파일을 읽는 좋은 방법이라고 생각합니다.

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

3

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

3

Rich, Orian 및 나머지 사용자의 동의에 동의합니다.

    final File keysFileFolder = new File(<path>); 
    File[] fileslist = keysFileFolder.listFiles();

    if(fileslist != null)
    {
        //Do your thing here...
    }

어떤 이유로 든 여기의 모든 예제는 절대 경로를 사용 합니다 (즉, 루트의 경우, 또는 Windows의 경우 드라이브 문자 (C : \)).

상대 경로를 잘 사용할 수 있다고 덧붙이고 싶습니다 . 따라서 pwd (현재 디렉토리 / 폴더)가 folder1이고 folder1 / subfolder를 구문 분석하려면 (위의 코드 대신)를 작성하십시오.

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

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

2

Java 8 Files.walk(..)은 당신이 그것을 던지지 않을 때 좋습니다 . (java.nio.file.AccessDeniedException)의 Java 8 Files.walk (..) 종료 원인을 피하십시오 .

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

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

1

허용 된 답변을 확장하기 위해 파일 이름을 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를 만들지 않습니다).


1

파일 경로를 인수로 지정하고 모든 파일 경로로 목록을 작성하고 수동으로 목록을 넣을 수는 없습니다. 그런 다음 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
                 }}}

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


}

0

클래스 경로 내에있는 테스트 폴더의 파일을 나열하십시오.

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


    }


}

0
/**
 * 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로 바꾸십시오.


0

위의 좋은 대답이 많이 있습니다. 여기에는 다른 접근 방식이 있습니다. 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());
    }

이제 특정 폴더에서 파일을 가져 오려면 resources 폴더에 'res'라는 폴더가 있다고 가정 해 보겠습니다.

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

com.companyName 패키지에 액세스하려면 다음을 수행하십시오.

contextClassLoader.getResource("com.companyName");

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

이것이 멍청한 질문이라면 미안하지만 무엇으로 전달해야 files container합니까?
Pramesh Bajracharya

0

이것은 잘 작동합니다 :

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

}

0

baseDir이 주어지면 그 아래의 모든 파일과 디렉토리가 반복적으로 기록됩니다.

    public static List<File> listLocalFilesAndDirsAllLevels(File baseDir) {

    List<File>  collectedFilesAndDirs   = new ArrayList<>();
    Deque<File> remainingDirs           = new ArrayDeque<>();

    if(baseDir.exists()) {
        remainingDirs.add(baseDir);

        while(!remainingDirs.isEmpty()) {
            File dir = remainingDirs.removeLast();
            List<File> filesInDir = Arrays.asList(dir.listFiles());
            for(File fileOrDir : filesInDir)  {
                collectedFilesAndDirs.add(fileOrDir);
                if(fileOrDir.isDirectory()) {
                    remainingDirs.add(fileOrDir);
                }
            }
        }
    }

    return collectedFilesAndDirs;
}

-1

listFiles () 함수에서 Nullpointer 예외를 방지하고 하위 디렉토리에서 모든 파일을 반복적으로 가져옵니다.

 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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.