Hoe lees ik alle bestanden in een map uit Java?

Hoe lees ik alle bestanden in een map via Java?


Antwoord 1, autoriteit 100%

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 is beschikbaar vanaf Java 8.

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

Het voorbeeld gebruikt het try-with-resourcespatroon aanbevolen in de API-gids. Het zorgt ervoor dat de stream onder alle omstandigheden wordt afgesloten.


Antwoord 2, autoriteit 18%

File folder = new File("/Users/you/folder/");
File[] listOfFiles = folder.listFiles();
for (File file : listOfFiles) {
    if (file.isFile()) {
        System.out.println(file.getName());
    }
}

Antwoord 3, autoriteit 14%

In Java 8 kunt u dit doen

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

die alle bestanden in een map afdrukken terwijl ze alle mappen exclusief zijn. Als u een lijst nodig hebt, doen het volgende:

Files.walk(Paths.get("/path/to/folder"))
     .filter(Files::isRegularFile)
     .collect(Collectors.toList())

Als u wilt retourneren List<File>in plaats van List<Path>Gewoon in kaart brengen:

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

U moet ook zorgen voor het sluiten van de stroom! Anders kunt u een uitzondering tegenkomen die u vertelt dat er te veel bestanden open zijn. Lees Hier voor meer informatie.


Antwoord 4, Autoriteit 3%

Alle antwoorden op dit onderwerp dat gebruik maakt van de nieuwe Java 8-functies zijn verwaarloosd om de stroom te sluiten. Het voorbeeld in het geaccepteerde antwoord zou moeten zijn:

try (Stream<Path> filePathStream=Files.walk(Paths.get("/home/you/Desktop"))) {
    filePathStream.forEach(filePath -> {
        if (Files.isRegularFile(filePath)) {
            System.out.println(filePath);
        }
    });
}

Van de Javadoc van de Files.walkmethode:

De geretourneerde stream is ingekapseld met een of meer directorystreams. Indien
Tijdige verwijdering van bestandssysteembronnen is vereist, de
Try-with-Resources Construct moet worden gebruikt om ervoor te zorgen dat de
De sluitmethode van stream wordt aangeroepen nadat de streambewerkingen zijn voltooid.


Antwoord 5, autoriteit 2%

Eén opmerking om alle bestanden in de map te krijgen.
De methode Files.walk(path)retourneert alle bestanden door de bestandsboom te doorlopen die is geroot op het gegeven gestarte bestand.

Er is bijvoorbeeld de volgende bestandsstructuur:

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

De java.nio.file.Files.walk(Path)gebruiken:

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

Geeft het volgende resultaat:

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

Om alle bestanden alleen in de huidige map te krijgen, gebruikt u de java.nio.file.Files.list(Path):

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

Resultaat:

folder\file1.txt
folder\file2.txt

Antwoord 6

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

Antwoord 7

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

Antwoord 8

In Java 7 en hoger kun je 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);
}

U kunt ook een filter maken dat vervolgens kan worden doorgegeven aan de bovenstaande newDirectoryStream-methode

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

Voor andere filtervoorbeelden, [zie documentatie].(http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#glob)


Antwoord 9

Loop gewoon door alle bestanden met behulp van 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;
    }
});

Antwoord 10

Als u meer opties wilt, kunt u deze functie gebruiken die tot doel heeft een arraylijst met bestanden in een map te vullen. Opties zijn: recursiviteit en overeenkomend patroon.

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

Beste, Adrien


Antwoord 11

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

Antwoord 12

goed gebruik van java.io.FileFilterzoals te zien op 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();
    }
});

Antwoord 13

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

Antwoord 14

Ik denk dat dit een goede manier is om alle bestanden in een map en submap’s te lezen

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

Antwoord 15

Eenvoudig voorbeeld dat werkt met Java 1.7 om recursief bestanden weer te geven in mappen die zijn opgegeven op de opdrachtregel:

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

Antwoord 16

Terwijl ik het eens ben met Rich, Orian en de rest voor het gebruik van:

   final File keysFileFolder = new File(<path>); 
    File[] fileslist = keysFileFolder.listFiles();
    if(fileslist != null)
    {
        //Do your thing here...
    }

Om een ​​of andere reden gebruikt alle voorbeelden hier absoluut pad (d.w.z. helemaal van wortel, of, zeg, drive letter (C: \) voor Windows ..)

Ik wil graag toevoegen dat het mogelijk is om relatief pad te gebruiken.
Dus, als u PWD (huidige map / map) map1 is en u map1 / submap wilt parseren, schrijft u gewoon (in de bovenstaande code in plaats van):

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

Antwoord 17

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

Antwoord 18

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

Antwoord 19

Java 8 Files.walk(..)is goed als je het goed vindt dat het geen Vermijd Java 8 Files.walk(..) beëindigingsoorzaak van ( java.nio.file.AccessDeniedException ).

Hier is een veilige oplossing, hoewel niet zo elegant als Java 8Files.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();
}

Antwoord 20

Er zijn veel goede antwoorden hierboven, hier is een andere aanpak: in een Maven-project wordt alles wat u in de map in de middelen plaatst, standaard in de map Target / Classes gebruikt. Om te zien wat er op runtime beschikbaar is

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

Nu om de bestanden van een specifieke map te krijgen, laten we zeggen dat u een map hebt genaamd ‘res’ in uw map map, vervang gewoon:

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

Als u toegang wilt hebben in uw COM.COMPANYNAME-pakket dan:

contextClassLoader.getResource("com.companyName");

Antwoord 21

Gewoon uitbreiden op het geaccepteerde antwoord Ik slaat de bestandsnamen op naar een arrayclist (in plaats van alleen te dumpen naar System.out.Println) Ik heb een helperklasse “MyFileutils” gemaakt, zodat het door andere projecten kan worden geïmporteerd:

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

Ik heb het volledige pad toegevoegd aan de bestandsnaam.
Je zou het zo gebruiken:

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

De arrayclist wordt doorgegeven door “waarde”, maar de waarde wordt gebruikt om te wijzen op hetzelfde arrayclist-object dat in de JVM-hoop leeft. Op deze manier voegt elke recursievragen bestandsnamen toe aan dezelfde arrayclist (we maken geen nieuwe arrayclist op elke recursieve oproep).


Antwoord 22

U kunt het bestandspad naar argument plaatsen en een lijst maken met alle FilePaths en deze niet handmatig de lijst plaatsen. Gebruik vervolgens een voor lus en een lezer. Voorbeeld voor TXT-bestanden:

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

Antwoord 23

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

Antwoord 24

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

Antwoord 25

lijst bestanden uit de testmap die aanwezig zijn in het klaspad

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

Antwoord 26

/**
 * 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"));
        }
    }

U kunt alle textfiles of een andere extensie filteren. Vervang het door. MP3


Antwoord 27

Hiermee wordt opgegeven bestandsuitbreidingsbestanden in het gegeven pad gelezen (ziet er ook submappen uit)

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

Antwoord 28

Dit werkt prima:

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

Antwoord 29

Gegeven een gebaseerdir, vermeldt alle bestanden en mappen eronder, iteratief geschreven.

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

ANTWOORD 30

We kunnen org.apache.commons.io.fileutils gebruiken, listfiles () mehtod gebruiken om alle bestanden in een bepaalde map te lezen.

bijvoorbeeld:

FileUtils.listFiles(directory, {"array of extension"}, true)

Hiermee leest u alle bestanden in de gegeven map met gegeven extensies, we kunnen meerdere extensies in de array doorgeven en recursief worden gelezen binnen de map (echte parameter).

Other episodes