Estoy de acuerdo, señale la clase que debe usar para que el póster pueda familiarizarse con los diversos métodos; de lo contrario, el póster no se molestará en leer la API para averiguar qué otros métodos están disponibles.
camickr
55
¿Quiso decir todos los archivos en una carpeta, o todos los archivos en una carpeta y todas las subcarpetas?
El ejemplo utiliza el patrón de prueba con recursos recomendado en la guía API. Asegura que, sin importar las circunstancias, la transmisión se cerrará.
getName()solo dará el nombre del archivo en su directorio, que podría ser un subdirectorio del original. Si planea utilizar esta información para encontrar los archivos, puede encontrar la ruta dada por getPath()más útil.
Tim Parenti
44
¿Puedo usar este método para encontrar todos los archivos de un tipo específico, por ejemplo, pdf o html, en todo mi sistema? Mi preocupación es la eficiencia, ¿es lo suficientemente rápido como para ser utilizado en sistemas con miles de archivos o hay una mejor alternativa?
Nitin Labhishetty
@codeln A partir de Java 8, el rendimiento es muy aceptable, no se nota nada de retraso. Es lo suficientemente rápido, eficiente y legible para hacer su trabajo.
¡También debes asegurarte de cerrar la transmisión! De lo contrario, podría encontrarse con una excepción que le indica que hay demasiados archivos abiertos. Lea aquí para más información.
Obteniendo un error con .map (Path :: toFile) También .forEach (path -> System.out.println (path.toString ()); debe ser .forEach (path -> System.out.println (path.toString ( )));
XaolingBao
2
Dice "Referencia de método no válida, no se puede encontrar el símbolo" ¿Se supone que toFile es otra cosa?
XaolingBao
2
¿Puedes pegar tu código en un PasteBin? Estas usando java.nio.file.Path? Acabo de comprobar que el método toFile () debería existir incluso antes de java 8 -> docs.oracle.com/javase/7/docs/api/java/nio/file/…
Todas las respuestas sobre este tema que hacen uso de las nuevas funciones de Java 8 están descuidando cerrar la secuencia. El ejemplo en la respuesta aceptada debería ser:
La secuencia devuelta encapsula uno o más DirectoryStreams. Si se requiere la eliminación oportuna de los recursos del sistema de archivos, la construcción de prueba con recursos se debe utilizar para garantizar que se invoque el método de cierre de la secuencia después de que se completen las operaciones de la secuencia.
Nunca debes iterar con Stream. Toma una referencia de Stream, la usa y la elimina.
Rudolf Schmidt
@RudolfSchmidt te refieres a "tirarlo a la basura"?
Roland
1
Quiero decir que la forma correcta es usarlo de esa manera: 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());}}}}}
Bienvenido a ! En lugar de solo publicar un bloque de código, explique por qué este código resuelve el problema planteado. Sin una explicación, esto no es una respuesta.
Martijn Pieters
De acuerdo, la simple publicación de un bloque de código no funcionará por favor agregue al menos algunos comentarios en el código ...
Ashraf.Shk786
este es un buen código, puede leer también archivos en subdirectorios de una carpeta.
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}}
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);}
También puede crear un filtro que luego se puede pasar al newDirectoryStreammétodo anterior
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;}}};
Estoy confundido por el ejemplo de crear filtro. Qué es newDirectoryStream.Filter <Path>. ¿Puedes mostrar cómo se declara eso?
simgineer
Creo que lo descubrí. es un error tipográfico de copiar y pegar. hay un espacio entre el "nuevo" y el "DirectoryStream.Filter ...". Si estoy en lo correcto, recomiendo corregir su ejemplo.
simgineer
9
Una observación de acuerdo para obtener todos los archivos en el directorio.
El método Files.walk(path)devolverá todos los archivos recorriendo el árbol de archivos enraizado en el archivo iniciado dado.
Por ejemplo, existe el siguiente árbol de archivos:
Tenga en cuenta que este código arrojará una excepción (y no informará más archivos) si para algún archivo o directorio no se pueden leer los atributos del archivo, por ejemplo, debido a los permisos. Fácil de reproducir en `C:`.
Thomas S.
5
Si desea más opciones, puede usar esta función que tiene como objetivo llenar una lista de archivos presentes en una carpeta. Las opciones son: recursivilidad y patrón a juego.
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;}
Es posible que desee agregar una explicación de lo que está tratando de lograr, en lugar de mostrar solo el código. Además, myarray=new File[10];no es obligatorio, ya que se sobrescribirá en la siguiente línea.
docs.oracle.com/javase/7/docs/api/java/io/… public File [] listFiles () Devuelve una matriz de nombres de ruta abstractos que denotan los archivos en el directorio indicado por este nombre de ruta abstracto.
andrej
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]);}}}
Si bien estoy de acuerdo con Rich, Orian y el resto por usar:
finalFile keysFileFolder =newFile(<path>);File[] fileslist = keysFileFolder.listFiles();if(fileslist !=null){//Do your thing here...}
por alguna razón, todos los ejemplos aquí usan una ruta absoluta (es decir, desde la raíz o, por ejemplo, la letra de la unidad (C: \) para Windows ...)
Me gustaría agregar que también es posible usar la ruta relativa . Entonces, si su pwd (directorio / carpeta actual) es folder1 y desea analizar folder1 / subfolder, simplemente escriba (en el código anterior en lugar de):
Solo para ampliar la respuesta aceptada, almaceno los nombres de archivo en una ArrayList (en lugar de simplemente volcarlos en System.out.println) Creé una clase auxiliar "MyFileUtils" para que otros proyectos la puedan importar:
ArrayList se pasa por "valor", pero el valor se usa para apuntar al mismo objeto ArrayList que vive en el montón JVM. De esta manera, cada llamada de recursión agrega nombres de archivo a la misma ArrayList (NO estamos creando una nueva ArrayList en cada llamada recursiva).
Puede poner la ruta del archivo a argumento y crear una lista con todas las rutas de archivo y no ponerla en la lista manualmente. Luego use un bucle for y un lector. Ejemplo para archivos txt:
enumerar archivos de la carpeta de prueba presente dentro de la ruta de clase
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"));}}
Puede filtrar cualquier archivo de texto o cualquier otra extensión ... simplemente reemplácelo con .MP3
Hay muchas buenas respuestas arriba, aquí hay un enfoque diferente: en un proyecto maven, todo lo que pones en la carpeta de recursos se copia por defecto en la carpeta de destino / clases. Para ver lo que está disponible en tiempo de ejecución
Ahora, para obtener los archivos de una carpeta específica, supongamos que tiene una carpeta llamada 'res' en su carpeta de recursos, simplemente reemplace:
Lo siento si esta es una pregunta novata, pero ¿qué debo pasar como files container?
Pramesh Bajracharya
0
Esto funcionará 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
, consulte stackoverflow.com/a/23814217/1115554Respuestas:
Files.walk API está disponible en Java 8.
El ejemplo utiliza el patrón de prueba con recursos recomendado en la guía API. Asegura que, sin importar las circunstancias, la transmisión se cerrará.
fuente
getName()
solo dará el nombre del archivo en su directorio, que podría ser un subdirectorio del original. Si planea utilizar esta información para encontrar los archivos, puede encontrar la ruta dada porgetPath()
más útil.filter
método. Entonces para cada uno ya no es necesario. Ver aquí -> stackoverflow.com/a/26215931/1029251fuente
En Java 8 puedes hacer esto
que imprimirá todos los archivos en una carpeta mientras excluye todos los directorios. Si necesita una lista, lo siguiente será suficiente:
Si desea regresar en
List<File>
lugar deList<Path>
simplemente mapearlo:¡También debes asegurarte de cerrar la transmisión! De lo contrario, podría encontrarse con una excepción que le indica que hay demasiados archivos abiertos. Lea aquí para más información.
fuente
java.nio.file.Path
? Acabo de comprobar que el método toFile () debería existir incluso antes de java 8 -> docs.oracle.com/javase/7/docs/api/java/nio/file/…Todas las respuestas sobre este tema que hacen uso de las nuevas funciones de Java 8 están descuidando cerrar la secuencia. El ejemplo en la respuesta aceptada debería ser:
Del javadoc del
Files.walk
método:fuente
fuente
fuente
En Java 7 y superior puedes usar listdir
También puede crear un filtro que luego se puede pasar al
newDirectoryStream
método anteriorPara otros ejemplos de filtrado, [ver documentación]. ( Http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#glob )
fuente
Una observación de acuerdo para obtener todos los archivos en el directorio.
El método
Files.walk(path)
devolverá todos los archivos recorriendo el árbol de archivos enraizado en el archivo iniciado dado.Por ejemplo, existe el siguiente árbol de archivos:
Usando el
java.nio.file.Files.walk(Path)
:Da el siguiente resultado:
Para obtener todos los archivos solo en el directorio actual, use
java.nio.file.Files.list(Path)
:Resultado:
fuente
Files.list
ejemplo. Si no desea buscar de forma recursiva, esta puede ser la mejor opción a veces.Simplemente recorra todos los archivos usando
Files.walkFileTree
(Java 7)fuente
Si desea más opciones, puede usar esta función que tiene como objetivo llenar una lista de archivos presentes en una carpeta. Las opciones son: recursivilidad y patrón a juego.
Mejor Adrien
fuente
fuente
myarray=new File[10];
no es obligatorio, ya que se sobrescribirá en la siguiente línea.buen uso de
java.io.FileFilter
como se ve en https://stackoverflow.com/a/286001/146745fuente
fuente
Creo que esta es una buena manera de leer todos los archivos en una carpeta y subcarpeta
fuente
Ejemplo simple que funciona con Java 1.7 para enumerar recursivamente archivos en directorios especificados en la línea de comandos:
fuente
Si bien estoy de acuerdo con Rich, Orian y el resto por usar:
por alguna razón, todos los ejemplos aquí usan una ruta absoluta (es decir, desde la raíz o, por ejemplo, la letra de la unidad (C: \) para Windows ...)
Me gustaría agregar que también es posible usar la ruta relativa . Entonces, si su pwd (directorio / carpeta actual) es folder1 y desea analizar folder1 / subfolder, simplemente escriba (en el código anterior en lugar de):
fuente
fuente
Java 8
Files.walk(..)
es bueno cuando está adolorido, no arrojará Evite la causa de terminación de Java 8 Files.walk (..) de (java.nio.file.AccessDeniedException) .Aquí hay una solución segura, aunque no tan elegante como Java 8
Files.walk(..)
:fuente
fuente
Solo para ampliar la respuesta aceptada, almaceno los nombres de archivo en una ArrayList (en lugar de simplemente volcarlos en System.out.println) Creé una clase auxiliar "MyFileUtils" para que otros proyectos la puedan importar:
Agregué la ruta completa al nombre del archivo. Lo usarías así:
ArrayList se pasa por "valor", pero el valor se usa para apuntar al mismo objeto ArrayList que vive en el montón JVM. De esta manera, cada llamada de recursión agrega nombres de archivo a la misma ArrayList (NO estamos creando una nueva ArrayList en cada llamada recursiva).
fuente
Puede poner la ruta del archivo a argumento y crear una lista con todas las rutas de archivo y no ponerla en la lista manualmente. Luego use un bucle for y un lector. Ejemplo para archivos txt:
fuente
fuente
fuente
fuente
Puede filtrar cualquier archivo de texto o cualquier otra extensión ... simplemente reemplácelo con .MP3
fuente
Hay muchas buenas respuestas arriba, aquí hay un enfoque diferente: en un proyecto maven, todo lo que pones en la carpeta de recursos se copia por defecto en la carpeta de destino / clases. Para ver lo que está disponible en tiempo de ejecución
Ahora, para obtener los archivos de una carpeta específica, supongamos que tiene una carpeta llamada 'res' en su carpeta de recursos, simplemente reemplace:
Si desea tener acceso en su paquete com.companyName, entonces:
fuente
Esto leerá los archivos de extensión de archivo especificados en la ruta dada (también se ven las subcarpetas)
fuente
files container
?Esto funcionará bien:
fuente
Dado un baseDir, enumera todos los archivos y directorios debajo de él, escritos iterativamente.
fuente
para evitar Nullpointerexceptions en la función listFiles () y obtener recursivamente todos los archivos de subdirectorios también ...
fuente