วิธีอ่านไฟล์ทั้งหมดในโฟลเดอร์จาก Java


669

จะอ่านไฟล์ทั้งหมดในโฟลเดอร์ผ่าน Java ได้อย่างไร


8
ฉันเห็นด้วยชี้ให้ผู้เรียนใช้เพื่อให้ผู้โพสต์คุ้นเคยกับวิธีการต่าง ๆ ไม่เช่นนั้นผู้โพสต์จะไม่สนใจอ่าน API เพื่อดูว่ามีวิธีอื่นใดบ้าง
camickr

5
คุณหมายถึงไฟล์ทั้งหมดในโฟลเดอร์หรือไฟล์ทั้งหมดในโฟลเดอร์และโฟลเดอร์ย่อยทั้งหมดหรือไม่
Jim Garrison

3
ลิงก์ที่ทันสมัยไปยัง API: docs.oracle.com/javase/7/docs/api/java/io/File.html
Tom Duckering

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

@codeln ในฐานะของ Java 8 ประสิทธิภาพเป็นที่ยอมรับมากคุณไม่สังเกตเห็นอะไรเลยเกี่ยวกับมัน รวดเร็วมีประสิทธิภาพและอ่านง่ายพอที่จะทำให้งานของคุณสำเร็จ
tom_mai78101

17
ใน Java 8 คุณสามารถใช้filterวิธีนี้ได้เช่นกัน จากนั้นไม่จำเป็นต้องใช้แต่ละครั้ง ดูที่นี่ -> stackoverflow.com/a/26215931/1029251
Julian Pieles

3
เพียงเพื่อระบุว่าจะเริ่มต้นได้เพียงครั้งเดียว
รวย

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
มันบอกว่า "การอ้างอิงวิธีการที่ไม่ถูกต้องไม่สามารถหาสัญลักษณ์" "วิธีการ toFile" เป็นไฟล์ที่ควรจะเป็นอย่างอื่น?
XaolingBao

2
คุณกรุณาวางรหัสของคุณใน PasteBin ได้หรือไม่? คุณกำลังใช้java.nio.file.Path? ฉันเพิ่งตรวจสอบวิธี toFile () ควรมีอยู่ก่อนหน้าจาวา 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
หากใครยังคงมองหาหัวข้อลองจับแลมบ์ดา URL ของบล็อกของฉันมีการเปลี่ยนแปลง -> razem.io/blog/y2015/0819_try_catch_lambda.html
Julian Pieles

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

จาก javadoc ของFiles.walkวิธีการ:

กระแสข้อมูลที่ส่งคืนห่อหุ้มอย่างน้อยหนึ่ง DirectoryStreams หากจำเป็นต้องกำจัดทรัพยากรระบบไฟล์อย่างทันท่วงทีควรใช้การสร้างทรัพยากรแบบลองกับทรัพยากรเพื่อให้แน่ใจว่าวิธีการปิดสตรีมจะถูกเรียกใช้หลังจากการดำเนินการสตรีมเสร็จสมบูรณ์


คุณไม่ควรทำซ้ำกับสตรีม คุณทำการอ้างอิงสตรีมใช้มันและผ่านมันออกไป
Rudolf Schmidt

@RudolfSchmidt คุณหมายถึง "ทิ้ง"
Roland

1
ฉันหมายถึงวิธีที่ถูกต้องคือการใช้ในทางนั้น: Files.walk (Paths.get ("/ home / you / Desktop")) ตัวกรอง (Files :: isRegularFile). forEach (filePath -> ... )
Rudolf Schmidt

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

นี่เป็นรหัสที่ดีมันสามารถอ่านไฟล์ในไดเรกทอรีย่อยของโฟลเดอร์ได้เช่นกัน
ไมเมา

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

นี่คือทางออกสำหรับ Android อ่านไฟล์และโฟลเดอร์ทั้งหมดจาก sdcard หรือที่เก็บข้อมูลภายใน
Sanket Thakkar

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

ฉันคิดว่าฉันคิดออก มันเป็นสำเนาและวางพิมพ์ผิด มีช่องว่างระหว่าง "ใหม่" และ "DirectoryStream.Filter ... " หากฉันถูกต้องแนะนำให้แก้ไขตัวอย่างของคุณ
simgineer

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ตัวอย่าง หากคุณไม่ต้องการค้นหาแบบเรียกซ้ำสิ่งนี้อาจเป็นตัวเลือกที่ดีที่สุดในบางครั้ง
ต่อ 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: '
โธมัสเอส.

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

ดีที่สุดเอเดรียน


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

ใช้งานได้ดีjava.io.FileFilterเท่าที่เห็นในhttps://stackoverflow.com/a/286001/146745

File fl = new File(dir);
File[] files = fl.listFiles(new FileFilter() {          
    public boolean accept(File file) {
        return file.isFile();
    }
});

docs.oracle.com/javase/7/docs/api/java/io/… ไฟล์สาธารณะ [] listFiles () ส่งกลับอาร์เรย์ของชื่อพา ธ นามธรรมที่แสดงถึงไฟล์ในไดเรกทอรีที่แสดงโดยชื่อพา ธ นามธรรมนี้
andrej

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

ในขณะที่ฉันเห็นด้วยกับอุดม Orian และส่วนที่เหลือสำหรับการใช้:

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

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

ด้วยเหตุผลบางตัวอย่างทั้งหมดที่นี่ใช้พา ธสัมบูรณ์ (เช่นตลอดทางจากรูทหรือพูดอักษรระบุไดรฟ์ (C: \) สำหรับ windows .. )

ฉันต้องการเพิ่มว่าเป็นไปได้ที่จะใช้เส้นทางสัมพัทธ์เช่นกัน ดังนั้นหากคุณเป็น pwd (ไดเรกทอรีปัจจุบัน / โฟลเดอร์) คือ folder1 และคุณต้องการแยกโฟลเดอร์ 1 / โฟลเดอร์ย่อยคุณเพียงแค่เขียน (ในรหัสด้านบนแทน):

    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(..)เป็นสิ่งที่ดีเมื่อคุณอยู่ soore มันจะไม่โยนหลีกเลี่ยง Java 8 Files.walk ( .. ) สาเหตุของการเลิกจ้าง (java.nio.file.AccessDeniedException)

นี่คือวิธีที่ปลอดภัยไม่ แต่เพื่อความสง่างามเป็น 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" แต่ค่าจะถูกใช้เพื่อชี้ไปยังวัตถุ ArrayList เดียวกันที่อยู่ใน JVM Heap ด้วยวิธีนี้การเรียกซ้ำแต่ละครั้งจะเพิ่มชื่อไฟล์ใน ArrayList เดียวกัน (เราไม่ได้สร้าง ArrayList ใหม่ในการเรียกซ้ำแต่ละครั้ง)


1

คุณสามารถวางพา ธ ของไฟล์เพื่อโต้แย้งและสร้างรายการด้วยพา ธ ไฟล์ทั้งหมดและไม่ต้องใส่รายชื่อด้วยตนเอง จากนั้นใช้สำหรับลูปและตัวอ่าน ตัวอย่างไฟล์ 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 ทุกสิ่งที่คุณใส่ในโฟลเดอร์ทรัพยากรจะถูกคัดลอกโดยค่าเริ่มต้นในโฟลเดอร์เป้าหมาย / ชั้นเรียน เพื่อดูว่ามีอะไรที่รันไทม์

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

ตอนนี้เพื่อรับไฟล์จากโฟลเดอร์เฉพาะสมมติว่าคุณมีโฟลเดอร์ชื่อ '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;
}

ขออภัยถ้าเป็นคำถาม noob แต่ฉันควรผ่านเป็น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

เพื่อป้องกัน Nullpointerexceptions ในฟังก์ชั่น listFiles () และเรียกไฟล์ทั้งหมดซ้ำจากไดเรกทอรีย่อยด้วยซ้ำ

 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.