Concordo, aponte a classe a ser usada para que o pôster possa se familiarizar com os vários métodos; caso contrário, o pôster não se preocupa em ler a API para descobrir quais outros métodos estão disponíveis.
camickr
5
Você quis dizer todos os arquivos em uma pasta ou todos os arquivos em uma pasta e todas as subpastas?
getName()fornecerá apenas o nome do arquivo em seu diretório, que pode ser um subdiretório do original. Se você planeja usar essas informações para encontrar os arquivos, pode achar que o caminho fornecido getPath()é mais útil.
precisa saber é o seguinte
4
Posso usar esse método para encontrar todos os arquivos de um tipo específico, como pdf ou html em todo o sistema? Minha preocupação é eficiência, é rápido o suficiente para ser usado em sistemas com milhares de arquivos ou existe uma alternativa melhor?
Nitin Labhishetty 10/03/2014
@codeln No Java 8, o desempenho é muito aceitável, você não percebe nada em atraso. É rápido, eficiente e legível o suficiente para fazer seu trabalho.
Você também precisa fechar o fluxo! Caso contrário, você poderá encontrar uma exceção informando que muitos arquivos estão abertos. Leia aqui para mais informações.
Obtendo um erro com .map (Path :: toFile) Também .forEach (caminho -> System.out.println (path.toString ()); deve ser .forEach (caminho -> System.out.println (path.toString ( )););
XaolingBao
2
Diz "Referência de método inválida, não é possível encontrar o símbolo" "O método toFile" é toFile que deveria ser outra coisa?
XaolingBao
2
Você pode colar seu código em um PasteBin? Você está usando java.nio.file.Path? Acabei de verificar o método TOFILE () deve existir mesmo antes de java 8 -> docs.oracle.com/javase/7/docs/api/java/nio/file/...
Todas as respostas neste tópico que utilizam as novas funções do Java 8 estão negligenciando o fechamento do fluxo. O exemplo na resposta aceita deve ser:
O fluxo retornado encapsula um ou mais DirectoryStreams. Se o descarte oportuno dos recursos do sistema de arquivos for necessário, a construção try-with-resources deve ser usada para garantir que o método de fechamento do fluxo seja chamado após a conclusão das operações do fluxo.
Você nunca deve iterar com o Stream. Você pega uma referência de Stream, usa-a e passa por ela.
Rudolf Schmidt
@RudolfSchmidt você quer dizer "jogar fora"?
Roland
1
Quero dizer que a maneira correta é usá-lo dessa maneira: 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());}}}}}
Bem-vindo ao ! Em vez de publicar apenas um bloco de código, explique por que esse código resolve o problema apresentado. Sem uma explicação, isso não é uma resposta.
Martijn Pieters
Concordado, Apenas postar um bloco de código não funcionará, por favor, pelo menos, adicione alguns comentários no código ... #
Ashraf.Shk786 #
como esse código é bom, ele também pode ler arquivos em subdiretórios de uma pasta.
18719
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);}
Você também pode criar um filtro que pode ser passado para o diretório newDirectoryStream método acima
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;}}};
Estou confuso com o exemplo de filtro de criação. O que é newDirectoryStream.Filter <caminho>. Você pode mostrar como isso é declarado?
Simgineer
Eu acho que descobri. é um erro de copiar e colar. existe um espaço entre o "novo" e o "DirectoryStream.Filter ...". Se eu estiver certo, recomendo corrigir o seu exemplo.
Simgineer
9
Uma observação para obter todos os arquivos no diretório
O método Files.walk(path)retornará todos os arquivos percorrendo a árvore de arquivos enraizada no arquivo inicial fornecido.
Observe que esse código lançará uma exceção (e não reportará nenhum arquivo adicional) se, para algum arquivo ou diretório, os atributos do arquivo não puderem ser lidos, por exemplo, devido a permissões. Fácil de reproduzir em `C:`.
Thomas S.
5
Se você quiser mais opções, poderá usar esta função que visa preencher uma lista de matriz de arquivos presentes em uma pasta. As opções são: recursividade e padrão a serem correspondidos.
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;}
Você pode adicionar uma explicação sobre o que está tentando obter, em vez de mostrar apenas o código. Além disso, myarray=new File[10];não é necessário, pois será substituído pela próxima linha!
docs.oracle.com/javase/7/docs/api/java/io/… Arquivo público [] listFiles () Retorna uma matriz de nomes de caminho abstratos que indicam os arquivos no diretório indicado por esse nome de caminho abstrato.
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]);}}}
Embora eu concorde com Rich, Orian e o restante em usar:
finalFile keysFileFolder =newFile(<path>);File[] fileslist = keysFileFolder.listFiles();if(fileslist !=null){//Do your thing here...}
por alguma razão, todos os exemplos aqui usam absoluto caminho (ou seja, desde o raiz ou, digamos, a letra da unidade (C: \) para o Windows ..)
Eu gostaria de acrescentar que também é possível usar o caminho relativo . Portanto, se você é pwd (diretório / pasta atual) é folder1 e deseja analisar folder1 / subpasta, basta escrever (no código acima, em vez de):
Apenas para expandir a resposta aceita, armazenei os nomes de arquivos em um ArrayList (em vez de apenas despejá-los no System.out.println), criei uma classe auxiliar "MyFileUtils" para que pudesse ser importada por outros projetos:
O ArrayList é passado por "value", mas o valor é usado para apontar para o mesmo objeto ArrayList que vive no Heap da JVM. Dessa forma, cada chamada de recursão adiciona nomes de arquivos à mesma ArrayList (NÃO estamos criando uma nova ArrayList em cada chamada recursiva).
Você pode colocar o caminho do arquivo em argumento e criar uma lista com todos os caminhos de arquivo, e não a lista manualmente. Em seguida, use um loop for e um leitor. Exemplo para arquivos txt:
listar arquivos da pasta Test presentes no caminho da 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"));}}
Você pode filtrar qualquer arquivo de texto ou qualquer outra extensão. Apenas substitua-o por .MP3
Há muitas boas respostas acima, eis uma abordagem diferente: em um projeto de maven, tudo o que você coloca na pasta de recursos é copiado por padrão na pasta de destino / classes. Para ver o que está disponível em tempo de execução
Desculpe se isso é uma pergunta noob, mas o que devo passar como um files container?
Pramesh Bajracharya
0
Isso funcionará bem:
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/1115554Respostas:
A API Files.walk está disponível no Java 8.
O exemplo usa o padrão try-with-resources recomendado no guia da API. Ele garante que, independentemente das circunstâncias, o fluxo será fechado.
fonte
getName()
fornecerá apenas o nome do arquivo em seu diretório, que pode ser um subdiretório do original. Se você planeja usar essas informações para encontrar os arquivos, pode achar que o caminho fornecidogetPath()
é mais útil.filter
método Então forEach não é mais necessário. Veja aqui -> stackoverflow.com/a/26215931/1029251fonte
No Java 8, você pode fazer isso
que imprimirá todos os arquivos em uma pasta enquanto exclui todos os diretórios. Se você precisar de uma lista, fará o seguinte:
Se você deseja retornar em
List<File>
vez deList<Path>
apenas mapeá-lo:Você também precisa fechar o fluxo! Caso contrário, você poderá encontrar uma exceção informando que muitos arquivos estão abertos. Leia aqui para mais informações.
fonte
java.nio.file.Path
? Acabei de verificar o método TOFILE () deve existir mesmo antes de java 8 -> docs.oracle.com/javase/7/docs/api/java/nio/file/...Todas as respostas neste tópico que utilizam as novas funções do Java 8 estão negligenciando o fechamento do fluxo. O exemplo na resposta aceita deve ser:
No javadoc do
Files.walk
método:fonte
fonte
fonte
No Java 7 e superior, você pode usar listdir
Você também pode criar um filtro que pode ser passado para o diretório
newDirectoryStream
método acimaPara outros exemplos de filtragem, consulte a documentação ( http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#glob )
fonte
Uma observação para obter todos os arquivos no diretório
O método
Files.walk(path)
retornará todos os arquivos percorrendo a árvore de arquivos enraizada no arquivo inicial fornecido.Por exemplo, existe a próxima árvore de arquivos:
Usando o
java.nio.file.Files.walk(Path)
:Dá o seguinte resultado:
Para obter todos os arquivos apenas no diretório atual, use o
java.nio.file.Files.list(Path)
:Resultado:
fonte
Files.list
exemplo. Se você não deseja pesquisar recursivamente, essa pode ser a melhor opção algumas vezes.Basta percorrer todos os arquivos usando
Files.walkFileTree
(Java 7)fonte
Se você quiser mais opções, poderá usar esta função que visa preencher uma lista de matriz de arquivos presentes em uma pasta. As opções são: recursividade e padrão a serem correspondidos.
Adrien Best
fonte
fonte
myarray=new File[10];
não é necessário, pois será substituído pela próxima linha!bom uso de
java.io.FileFilter
como visto em https://stackoverflow.com/a/286001/146745fonte
fonte
Eu acho que essa é uma boa maneira de ler todos os arquivos em uma pasta e subpasta
fonte
Exemplo simples que funciona com o Java 1.7 para listar recursivamente os arquivos nos diretórios especificados na linha de comandos:
fonte
Embora eu concorde com Rich, Orian e o restante em usar:
por alguma razão, todos os exemplos aqui usam absoluto caminho (ou seja, desde o raiz ou, digamos, a letra da unidade (C: \) para o Windows ..)
Eu gostaria de acrescentar que também é possível usar o caminho relativo . Portanto, se você é pwd (diretório / pasta atual) é folder1 e deseja analisar folder1 / subpasta, basta escrever (no código acima, em vez de):
fonte
fonte
O Java 8
Files.walk(..)
é bom quando você está navegando, mas não lançará a causa de terminação Evite o Java 8 Files.walk (..) da (java.nio.file.AccessDeniedException) .Aqui está uma solução segura, embora não tão elegante quanto o Java 8
Files.walk(..)
:fonte
fonte
Apenas para expandir a resposta aceita, armazenei os nomes de arquivos em um ArrayList (em vez de apenas despejá-los no System.out.println), criei uma classe auxiliar "MyFileUtils" para que pudesse ser importada por outros projetos:
Eu adicionei o caminho completo ao nome do arquivo. Você usaria assim:
O ArrayList é passado por "value", mas o valor é usado para apontar para o mesmo objeto ArrayList que vive no Heap da JVM. Dessa forma, cada chamada de recursão adiciona nomes de arquivos à mesma ArrayList (NÃO estamos criando uma nova ArrayList em cada chamada recursiva).
fonte
Você pode colocar o caminho do arquivo em argumento e criar uma lista com todos os caminhos de arquivo, e não a lista manualmente. Em seguida, use um loop for e um leitor. Exemplo para arquivos txt:
fonte
fonte
fonte
fonte
Você pode filtrar qualquer arquivo de texto ou qualquer outra extensão. Apenas substitua-o por .MP3
fonte
Há muitas boas respostas acima, eis uma abordagem diferente: em um projeto de maven, tudo o que você coloca na pasta de recursos é copiado por padrão na pasta de destino / classes. Para ver o que está disponível em tempo de execução
Agora, para obter os arquivos de uma pasta específica, digamos que você tenha uma pasta chamada 'res' na sua pasta de recursos, basta substituir:
Se você deseja ter acesso ao seu pacote com.companyName, então:
fonte
Isso lerá arquivos de extensão de arquivo especificados no caminho especificado (também parece com subpastas)
fonte
files container
?Isso funcionará bem:
fonte
Dado um baseDir, lista todos os arquivos e diretórios abaixo dele, escritos iterativamente.
fonte
para impedir Nexpointerexceptions na função listFiles () e obter recursivamente todos os arquivos de subdiretórios também.
fonte