Java에서 폴더의 모든 파일을 읽는 방법?



Answers

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

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

Java를 통해 폴더의 모든 파일을 읽는 방법?




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




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




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



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



https://.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();
    }
});



클래스 경로 안에있는 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()));
                }
            }
        }


    }


}



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



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

         }
    }

}
}

메서드에 대한 기본 클래스를 알려줄 폴더를 전달하십시오.




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



새로운 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-construct를 사용해야합니다.




지정된 경로의 지정된 파일 확장명 파일을 읽습니다 (하위 폴더도 표시).

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



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

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



Links