Comment lire tous les fichiers d'un dossier via Java?
Files.walkFileTree
, voir stackoverflow.com/a/23814217/1115554
Comment lire tous les fichiers d'un dossier via Java?
Files.walkFileTree
, voir stackoverflow.com/a/23814217/1115554
Réponses:
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);
L' API Files.walk est disponible à partir de Java 8.
try (Stream<Path> paths = Files.walk(Paths.get("/home/you/Desktop"))) {
paths
.filter(Files::isRegularFile)
.forEach(System.out::println);
}
L'exemple utilise le modèle d' essai avec les ressources recommandé dans le guide de l'API. Il garantit que, quelles que soient les circonstances, le flux sera fermé.
getName()
ne donnera que le nom du fichier dans son répertoire, qui pourrait être un sous-répertoire de l'original. Si vous prévoyez d'utiliser ces informations pour rechercher les fichiers, vous pouvez trouver le chemin d'accès donné par getPath()
plus utile.
filter
méthode. Alors forEach n'est plus nécessaire. Voir ici -> stackoverflow.com/a/26215931/1029251
File folder = new File("/Users/you/folder/");
File[] listOfFiles = folder.listFiles();
for (File file : listOfFiles) {
if (file.isFile()) {
System.out.println(file.getName());
}
}
Dans Java 8, vous pouvez le faire
Files.walk(Paths.get("/path/to/folder"))
.filter(Files::isRegularFile)
.forEach(System.out::println);
qui imprimera tous les fichiers d'un dossier tout en excluant tous les répertoires. Si vous avez besoin d'une liste, ce qui suit fera:
Files.walk(Paths.get("/path/to/folder"))
.filter(Files::isRegularFile)
.collect(Collectors.toList())
Si vous souhaitez revenir List<File>
au lieu de List<Path>
simplement le mapper:
List<File> filesInFolder = Files.walk(Paths.get("/path/to/folder"))
.filter(Files::isRegularFile)
.map(Path::toFile)
.collect(Collectors.toList());
Vous devez également vous assurer de fermer le flux! Sinon, vous pourriez rencontrer une exception vous indiquant que trop de fichiers sont ouverts. Lisez ici pour plus d'informations.
java.nio.file.Path
? Je viens de vérifier que la méthode toFile () devrait exister avant même java 8 -> docs.oracle.com/javase/7/docs/api/java/nio/file/…
Toutes les réponses à ce sujet qui utilisent les nouvelles fonctions Java 8 négligent de fermer le flux. L'exemple dans la réponse acceptée devrait être:
try (Stream<Path> filePathStream=Files.walk(Paths.get("/home/you/Desktop"))) {
filePathStream.forEach(filePath -> {
if (Files.isRegularFile(filePath)) {
System.out.println(filePath);
}
});
}
Du javadoc de la Files.walk
méthode:
Le flux renvoyé encapsule un ou plusieurs DirectoryStreams. Si l'élimination des ressources du système de fichiers en temps opportun est nécessaire, la construction try-with-resources doit être utilisée pour garantir que la méthode close du flux est invoquée une fois les opérations de flux terminées.
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());
}
}
}
}
}
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
}
}
Dans Java 7 et supérieur, vous pouvez utiliser 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);
}
Vous pouvez également créer un filtre qui peut ensuite être passé dans la newDirectoryStream
méthode ci-dessus
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;
}
}
};
Pour d'autres exemples de filtrage, [voir la documentation]. ( Http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#glob )
Une remarque selon pour obtenir tous les fichiers du répertoire.
La méthode Files.walk(path)
retournera tous les fichiers en parcourant l'arborescence de fichiers enracinée dans le fichier démarré donné.
Par exemple, il y a l'arborescence de fichiers suivante:
\---folder
| file1.txt
| file2.txt
|
\---subfolder
file3.txt
file4.txt
Utilisation de java.nio.file.Files.walk(Path)
:
Files.walk(Paths.get("folder"))
.filter(Files::isRegularFile)
.forEach(System.out::println);
Donne le résultat suivant:
folder\file1.txt
folder\file2.txt
folder\subfolder\file3.txt
folder\subfolder\file4.txt
Pour obtenir tous les fichiers uniquement dans le répertoire courant, utilisez java.nio.file.Files.list(Path)
:
Files.list(Paths.get("folder"))
.filter(Files::isRegularFile)
.forEach(System.out::println);
Résultat:
folder\file1.txt
folder\file2.txt
Files.list
exemple. Si vous ne souhaitez pas effectuer de recherche récursive, cela peut parfois être la meilleure option.
Parcourez tous les fichiers à l'aide de 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;
}
});
Si vous voulez plus d'options, vous pouvez utiliser cette fonction qui vise à remplir une liste de fichiers présents dans un dossier. Les options sont: la récursivité et le modèle correspondant.
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;
}
Bien, Adrien
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";
}
}
myarray=new File[10];
n'est pas obligatoire, car il sera écrasé par la ligne suivante!
belle utilisation de java.io.FileFilter
comme vu sur 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();
}
});
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]);
}
}
}
Je pense que c'est un bon moyen de lire tous les fichiers d'un dossier et d'un sous-dossier
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);
}
}
Exemple simple qui fonctionne avec Java 1.7 pour répertorier récursivement les fichiers dans les répertoires spécifiés sur la ligne de commande:
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());
}
}
}
}
Bien que je sois d'accord avec Rich, Orian et les autres pour utiliser:
final File keysFileFolder = new File(<path>);
File[] fileslist = keysFileFolder.listFiles();
if(fileslist != null)
{
//Do your thing here...
}
pour une raison quelconque, tous les exemples ici utilisent un chemin absolu (c'est-à-dire tout le chemin depuis la racine, ou, disons, la lettre de lecteur (C: \) pour Windows ..)
Je voudrais ajouter qu'il est également possible d'utiliser un chemin relatif . Donc, si vous êtes pwd (répertoire / dossier actuel) est dossier1 et que vous souhaitez analyser dossier1 / sous-dossier, vous écrivez simplement (dans le code ci-dessus au lieu de):
final File keysFileFolder = new File("subfolder");
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]);
}
}
}
}
Java 8 Files.walk(..)
est bon quand vous êtes soore, il ne lancera pas la cause de terminaison Éviter Java 8 Files.walk (..) de (java.nio.file.AccessDeniedException) .
Voici une solution sûre, pas aussi élégante que 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();
}
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);
}
}
}
Juste pour développer la réponse acceptée, je stocke les noms de fichiers dans une liste de tableaux (au lieu de simplement les vider dans System.out.println), j'ai créé une classe d'assistance "MyFileUtils" afin qu'elle puisse être importée par d'autres projets:
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() );
}
}
}
}
J'ai ajouté le chemin d'accès complet au nom de fichier. Vous l'utiliseriez comme ceci:
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 est passé par "value", mais la valeur est utilisée pour pointer vers le même objet ArrayList vivant dans le tas JVM. De cette façon, chaque appel récursif ajoute des noms de fichiers à la même ArrayList (nous ne créons PAS une nouvelle ArrayList à chaque appel récursif).
Vous pouvez mettre le chemin du fichier en argument et créer une liste avec tous les chemins de fichier et ne pas la placer manuellement dans la liste. Utilisez ensuite une boucle for et un lecteur. Exemple pour les fichiers 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
}}}
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());
}
}
}
}
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);
}
}
}
}
}
lister les fichiers du dossier Test présents dans le chemin de classe
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()));
}
}
}
}
}
/**
* 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"));
}
}
Vous pouvez filtrer n'importe quel fichier texte ou toute autre extension .. remplacez-le simplement par .MP3
Il existe de nombreuses bonnes réponses ci-dessus, voici une approche différente: dans un projet maven, tout ce que vous mettez dans le dossier des ressources est copié par défaut dans le dossier target / classes. Pour voir ce qui est disponible à l'exécution
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());
}
Maintenant, pour obtenir les fichiers d'un dossier spécifique, disons que vous avez un dossier appelé «res» dans votre dossier de ressources, remplacez simplement:
URL resource = contextClassLoader.getResource("res");
Si vous souhaitez avoir accès à votre package com.companyName, alors:
contextClassLoader.getResource("com.companyName");
Cela lira les fichiers d'extension de fichier spécifiés dans le chemin d'accès donné (regarde également les sous-dossiers)
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
?
Cela fonctionnera bien:
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);
}
}
Étant donné un baseDir, répertorie tous les fichiers et répertoires en dessous, écrits de manière itérative.
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;
}
pour empêcher Nullpointerexceptions sur la fonction listFiles () et récupérer récursivement tous les fichiers des sous-répertoires aussi.
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);