Je suis d'accord, indiquez la classe à utiliser pour que l'affiche puisse se familiariser avec les différentes méthodes, sinon l'affiche ne prend pas la peine de lire l'API pour savoir quelles autres méthodes sont disponibles.
camickr
5
Voulez-vous dire tous les fichiers d'un dossier, ou tous les fichiers d'un dossier et tous les sous-dossiers?
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.
Tim Parenti
4
Puis-je utiliser cette méthode pour rechercher tous les fichiers d'un type spécifique, par exemple pdf ou html sur l'ensemble de mon système? Ma préoccupation est l'efficacité, est-elle suffisamment rapide pour être utilisée sur des systèmes contenant des milliers de fichiers ou existe-t-il une meilleure alternative?
Nitin Labhishetty
@codeln Depuis Java 8, les performances sont très acceptables, vous ne remarquez rien de décalé. Il est suffisamment rapide, efficace et lisible pour faire votre travail.
tom_mai78101
17
Dans Java 8, vous pouvez également utiliser la filterméthode. Alors forEach n'est plus nécessaire. Voir ici -> stackoverflow.com/a/26215931/1029251
Julian Pieles
3
Juste pour indiquer qu'il n'est initialisé qu'une seule fois.
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.
Obtenir une erreur avec .map (Path :: toFile) Aussi .forEach (path -> System.out.println (path.toString ()); devrait être .forEach (path -> System.out.println (path.toString ( )));
XaolingBao
2
Il dit "Référence de méthode non valide, impossible de trouver le symbole" "Méthode toFile" est-ce que toFile est censé être autre chose?
XaolingBao
2
Pouvez-vous s'il vous plaît coller votre code dans un PasteBin? Utilisez-vous 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:
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.
Vous ne devez jamais itérer avec Stream. Vous prenez une référence Stream, l'utilisez et la retrouvez.
Rudolf Schmidt
@RudolfSchmidt vous voulez dire "jetez-le"?
Roland
1
Je veux dire que la bonne façon est de l'utiliser de cette façon: Files.walk (Paths.get ("/ home / you / Desktop")). Filter (Files :: isRegularFile) .forEach (filePath -> ...)
Rudolf Schmidt
12
import java.io.File;publicclassReadFilesFromFolder{publicstaticFile folder =newFile("C:/Documents and Settings/My Documents/Downloads");staticString temp ="";publicstaticvoid main(String[] args){// TODO Auto-generated method stubSystem.out.println("Reading files under the folder "+ folder.getAbsolutePath());
listFilesForFolder(folder);}publicstaticvoid listFilesForFolder(finalFile folder){for(finalFile 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());}}}}}
Bienvenue à ! Plutôt que de publier uniquement un bloc de code, veuillez expliquer pourquoi ce code résout le problème posé. Sans explication, ce n'est pas une réponse.
Martijn Pieters
D'accord, le simple fait de poster un bloc de code ne fonctionnera pas, veuillez au moins ajouter quelques commentaires dans le code ...
Ashraf.Shk786
c'est aussi du bon code, il peut aussi lire des fichiers dans des sous-répertoires d'un dossier.
Mimouni
11
privatestaticfinalString ROOT_FILE_PATH="/";File f=newFile(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}}
Ceci est la solution pour Android lire tous les fichiers et dossiers de la carte SD ou du stockage interne.
Sanket Thakkar
10
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 newDirectoryStreamméthode ci-dessus
DirectoryStream.Filter<Path> filter =newDirectoryStream.Filter<Path>(){publicboolean accept(Path file)throwsIOException{try{return(Files.isRegularFile(path));}catch(IOException x){// Failed to determine if it's a file.System.err.println(x);returnfalse;}}};
Je suis confus par l'exemple de création de filtre. Qu'est-ce que newDirectoryStream.Filter <Path>. Pouvez-vous montrer comment cela est déclaré?
simgineer
Je pense que je l'ai compris. c'est une faute de copier-coller. il y a un espace entre le "nouveau" et le "DirectoryStream.Filter ...". Si j'ai raison, je recommande de corriger votre exemple.
simgineer
9
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:
Notez que ce code lèvera une exception (et ne signalera aucun autre fichier) si, pour certains fichiers ou répertoires, les attributs de fichier n'ont pas pu être lus, par exemple en raison d'autorisations. Facile à reproduire sur `C:`.
Thomas S.
5
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.
publicstaticArrayList<File> listFilesForFolder(finalFile folder,finalboolean recursivity,finalString patternFileFilter){// Inputsboolean filteredFile =false;// OuputfinalArrayList<File> output =newArrayList<File>();// Foreach elementsfor(finalFile fileEntry : folder.listFiles()){// If this element is a directory, do it recursivlyif(fileEntry.isDirectory()){if(recursivity){
output.addAll(listFilesForFolder(fileEntry, recursivity, patternFileFilter));}}else{// If there is no pattern, the file is correctif(patternFileFilter.length()==0){
filteredFile =true;}// Otherwise we need to filter by patternelse{
filteredFile =Pattern.matches(patternFileFilter, fileEntry.getName());}// If the file has a name which match with the pattern, then add it to the listif(filteredFile){
output.add(fileEntry);}}}return output;}
Vous voudrez peut-être ajouter une explication de ce que vous essayez de réaliser, au lieu d'afficher uniquement le code. De plus, ce myarray=new File[10];n'est pas obligatoire, car il sera écrasé par la ligne suivante!
docs.oracle.com/javase/7/docs/api/java/io/… public File [] listFiles () Renvoie un tableau de noms de chemins abstraits désignant les fichiers du répertoire désigné par ce nom de chemin abstrait.
andrej du
3
staticFile mainFolder =newFile("Folder");publicstaticvoid main(String[] args){
lf.getFiles(lf.mainFolder);}publicvoid 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]);}}}
Bien que je sois d'accord avec Rich, Orian et les autres pour utiliser:
finalFile keysFileFolder =newFile(<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):
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:
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:
lister les fichiers du dossier Test présents dans le chemin de classe
import java.io.File;import java.io.IOException;publicclassHello{publicstaticvoid main(finalString[] args)throwsIOException{System.out.println("List down all the files present on the server directory");File file1 =newFile("/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
*/publicArrayList<HashMap<String,String>> getPlayList(){ArrayList<HashMap<String,String>> songsList=newArrayList<>();File home =newFile(MEDIA_PATH);if(home.listFiles(newFileExtensionFilter()).length >0){for(File file : home.listFiles(newFileExtensionFilter())){HashMap<String,String> song =newHashMap<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 arrayreturn songsList;}/**
* Class to filter files which have a .mp3 extension
* */classFileExtensionFilterimplementsFilenameFilter{@Overridepublicboolean 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
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:
Désolé si c'est une question noob mais que dois-je passer comme files container?
Pramesh Bajracharya
0
Cela fonctionnera bien:
privatestaticvoid addfiles(File inputValVal,ArrayList<File> files){if(inputVal.isDirectory()){ArrayList<File> path =newArrayList<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);}}
Files.walkFileTree
, voir stackoverflow.com/a/23814217/1115554Réponses:
L' API Files.walk est disponible à partir de Java 8.
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é.
la source
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é pargetPath()
plus utile.filter
méthode. Alors forEach n'est plus nécessaire. Voir ici -> stackoverflow.com/a/26215931/1029251la source
Dans Java 8, vous pouvez le faire
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:
Si vous souhaitez revenir
List<File>
au lieu deList<Path>
simplement le mapper: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.
la source
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:
Du javadoc de la
Files.walk
méthode:la source
la source
la source
Dans Java 7 et supérieur, vous pouvez utiliser listdir
Vous pouvez également créer un filtre qui peut ensuite être passé dans la
newDirectoryStream
méthode ci-dessusPour d'autres exemples de filtrage, [voir la documentation]. ( Http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#glob )
la source
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:
Utilisation de
java.nio.file.Files.walk(Path)
:Donne le résultat suivant:
Pour obtenir tous les fichiers uniquement dans le répertoire courant, utilisez
java.nio.file.Files.list(Path)
:Résultat:
la source
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)la source
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.
Bien, Adrien
la source
la source
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/146745la source
la source
Je pense que c'est un bon moyen de lire tous les fichiers d'un dossier et d'un sous-dossier
la source
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:
la source
Bien que je sois d'accord avec Rich, Orian et les autres pour utiliser:
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):
la source
la source
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(..)
:la source
la source
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:
J'ai ajouté le chemin d'accès complet au nom de fichier. Vous l'utiliseriez comme ceci:
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).
la source
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:
la source
la source
la source
la source
Vous pouvez filtrer n'importe quel fichier texte ou toute autre extension .. remplacez-le simplement par .MP3
la source
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
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:
Si vous souhaitez avoir accès à votre package com.companyName, alors:
la source
Cela lira les fichiers d'extension de fichier spécifiés dans le chemin d'accès donné (regarde également les sous-dossiers)
la source
files container
?Cela fonctionnera bien:
la source
Étant donné un baseDir, répertorie tous les fichiers et répertoires en dessous, écrits de manière itérative.
la source
pour empêcher Nullpointerexceptions sur la fonction listFiles () et récupérer récursivement tous les fichiers des sous-répertoires aussi.
la source