Я согласен, укажите класс для использования, чтобы автор мог ознакомиться с различными методами, в противном случае он не будет читать API, чтобы узнать, какие другие методы доступны.
camickr
5
Вы имели в виду все файлы в папке или все файлы в папке и всех подпапках?
В примере используется шаблон try-with-resources , рекомендованный в руководстве по API. Это гарантирует, что независимо от обстоятельств поток будет закрыт.
getName()даст только имя файла в его каталоге, который может быть подкаталогом оригинала. Если вы планируете использовать эту информацию для поиска файлов, возможно, вам getPath()будет полезен указанный путь .
Тим Паренти
4
Могу ли я использовать этот метод, чтобы найти все файлы определенного типа, например pdf или html, по всей моей системе? Меня беспокоит эффективность, достаточно ли она быстра для систем с тысячами файлов или есть лучшая альтернатива?
Nitin Labhishetty
@codeln Начиная с Java 8, производительность очень приемлемая, вы не заметите ничего запоздалого. Он быстрый, эффективный и достаточно читабельный, чтобы выполнить свою работу.
Вы также должны обязательно закрыть поток! В противном случае вы можете столкнуться с исключением, сообщающим, что открыто слишком много файлов. Читайте здесь для получения дополнительной информации.
Получение ошибки с .map (Path :: toFile) Также .forEach (путь -> System.out.println (path.toString ()); должен быть .forEach (путь -> System.out.println (path.toString ( )));
XaolingBao
2
Там написано: «Недопустимая ссылка на метод, не удается найти символ». «Метод toFile» должен ли toFile быть чем-то другим?
XaolingBao
2
Можете ли вы вставить свой код в PasteBin? Вы используете java.nio.file.Path? Я только что проверил, что метод toFile () должен существовать даже до java 8 -> docs.oracle.com/javase/7/docs/api/java/nio/file/…
Возвращенный поток инкапсулирует один или несколько DirectoryStreams. Если требуется своевременное удаление ресурсов файловой системы, следует использовать конструкцию try-with-resources, чтобы гарантировать, что метод close потока вызывается после завершения потоковых операций.
Вы никогда не должны повторяться с Stream. Вы берете ссылку на поток, используете его и через него прочь.
Рудольф Шмидт
@RudolfSchmidt ты имеешь в виду "выбросить"?
Роланд
1
Я имею в виду, что правильно использовать это следующим образом: Files.walk (Paths.get ("/ home / you / Desktop")). Filter (Files :: isRegularFile) .forEach (filePath -> ...)
Рудольф Шмидт
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());}}}}}
Добро пожаловать в ! Вместо того, чтобы только публиковать блок кода, пожалуйста, объясните, почему этот код решает поставленную проблему. Без объяснения это не ответ.
Мартин Питерс
Согласен, просто опубликовать блок кода не получится. По крайней мере, добавьте несколько комментариев в код ...
Ashraf.Shk786
Это хороший код, он также может читать файлы в подкаталогах папки.
Мимуни
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);}
Вы также можете создать фильтр, который затем может быть передан в newDirectoryStreamметод выше
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;}}};
Я смущен примером создания фильтра. Что такое newDirectoryStream.Filter <Path>. Можете ли вы показать, как это заявлено?
simgineer
Я думаю, что я понял это. это копия и вставка опечатка. между "новым" и "DirectoryStream.Filter ..." есть пробел. Если я прав, рекомендую исправить ваш пример.
simgineer
9
Одно замечание по получению всех файлов в каталоге.
МетодFiles.walk(path) вернет все файлы, пройдясь по дереву файлов с корнем в данном запущенном файле.
Обратите внимание, что этот код будет генерировать исключение (и не сообщать о каких-либо дополнительных файлах), если для какого-либо файла или каталога атрибуты файла не могут быть прочитаны, например, из-за разрешений. Легко воспроизвести на `C:`.
Томас С.
5
Если вам нужны дополнительные параметры, вы можете использовать эту функцию, которая предназначена для заполнения массива файлов, присутствующих в папке. Варианты: рекурсивность и шаблон для соответствия.
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;}
Возможно, вы захотите добавить объяснение того, чего вы пытаетесь достичь, вместо того, чтобы показывать только код. Кроме того, myarray=new File[10];не требуется, так как будет перезаписано следующей строкой!
Хотя я согласен с Ричем, Орианом и остальными за использование:
finalFile keysFileFolder =newFile(<path>);File[] fileslist = keysFileFolder.listFiles();if(fileslist !=null){//Do your thing here...}
по какой-то причине во всех примерах здесь используется абсолютный путь (т. е. весь путь от root или, скажем, буква диска (C: \) для Windows ..)
Я хотел бы добавить, что можно также использовать относительный путь. Итак, если вы pwd (текущая директория / папка) - это папка folder1 и вы хотите проанализировать вложенную папку folder1 /, вы просто пишете (в приведенном выше коде вместо):
Просто чтобы расширить принятый ответ, я сохраняю имена файлов в ArrayList (вместо того, чтобы просто выгружать их в System.out.println), я создал вспомогательный класс «MyFileUtils», чтобы он мог быть импортирован другими проектами:
ArrayList передается значением «value», но значение используется для указания на тот же объект ArrayList, который находится в куче JVM. Таким образом, каждый рекурсивный вызов добавляет имена файлов в один и тот же ArrayList (мы НЕ создаем новый ArrayList для каждого рекурсивного вызова).
Вы можете указать путь к файлу в качестве аргумента и создать список со всеми путями к файлам, но не указывать его вручную. Затем используйте цикл for и читатель. Пример для текстовых файлов:
список файлов из тестовой папки, присутствующих в пути к классам
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"));}}
Вы можете отфильтровать любые текстовые файлы или любое другое расширение. Просто замените его на .MP3
Есть много хороших ответов выше, вот другой подход: В проекте maven все, что вы помещаете в папку ресурсов, по умолчанию копируется в папку target / classes. Чтобы увидеть, что доступно во время выполнения
Извините, если это нубский вопрос, но что я должен передать как files container?
Прамеш Баджрачарья
0
Это будет хорошо работать:
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
, см stackoverflow.com/a/23814217/1115554Ответы:
API Files.walk доступен из Java 8.
В примере используется шаблон try-with-resources , рекомендованный в руководстве по API. Это гарантирует, что независимо от обстоятельств поток будет закрыт.
источник
getName()
даст только имя файла в его каталоге, который может быть подкаталогом оригинала. Если вы планируете использовать эту информацию для поиска файлов, возможно, вамgetPath()
будет полезен указанный путь .filter
метод. Тогда forEach больше не нужен. Смотрите здесь -> stackoverflow.com/a/26215931/1029251источник
В Java 8 вы можете сделать это
который напечатает все файлы в папке, исключая все каталоги. Если вам нужен список, сделайте следующее:
Если вы хотите вернуться
List<File>
вместо того, чтобыList<Path>
просто отобразить это:Вы также должны обязательно закрыть поток! В противном случае вы можете столкнуться с исключением, сообщающим, что открыто слишком много файлов. Читайте здесь для получения дополнительной информации.
источник
java.nio.file.Path
? Я только что проверил, что метод toFile () должен существовать даже до java 8 -> docs.oracle.com/javase/7/docs/api/java/nio/file/…Все ответы на эту тему, в которых используются новые функции Java 8, пренебрегают закрытием потока. Пример в принятом ответе должен быть:
Из javadoc
Files.walk
метода:источник
источник
источник
В Java 7 и выше вы можете использовать listdir
Вы также можете создать фильтр, который затем может быть передан в
newDirectoryStream
метод вышеДля других примеров фильтрации [см. Документацию]. ( Http://docs.oracle.com/javase/tutorial/essential/io/dirs.html#glob )
источник
Одно замечание по получению всех файлов в каталоге.
Метод
Files.walk(path)
вернет все файлы, пройдясь по дереву файлов с корнем в данном запущенном файле.Например, есть следующее дерево файлов:
Используя
java.nio.file.Files.walk(Path)
:Дает следующий результат:
Чтобы получить все файлы только в текущем каталоге, используйте
java.nio.file.Files.list(Path)
:Результат:
источник
Files.list
примера. Если вы не хотите выполнять рекурсивный поиск, иногда это может быть лучшим вариантом.Просто пройдите все файлы, используя
Files.walkFileTree
(Java 7)источник
Если вам нужны дополнительные параметры, вы можете использовать эту функцию, которая предназначена для заполнения массива файлов, присутствующих в папке. Варианты: рекурсивность и шаблон для соответствия.
Бест, Адриен
источник
источник
myarray=new File[10];
не требуется, так как будет перезаписано следующей строкой!хорошее использование,
java.io.FileFilter
как видно на https://stackoverflow.com/a/286001/146745источник
источник
Я думаю, что это хороший способ прочитать все файлы в папке и подпапке
источник
Простой пример, который работает с Java 1.7 для рекурсивного перечисления файлов в каталогах, указанных в командной строке:
источник
Хотя я согласен с Ричем, Орианом и остальными за использование:
по какой-то причине во всех примерах здесь используется абсолютный путь (т. е. весь путь от root или, скажем, буква диска (C: \) для Windows ..)
Я хотел бы добавить, что можно также использовать относительный путь. Итак, если вы pwd (текущая директория / папка) - это папка folder1 и вы хотите проанализировать вложенную папку folder1 /, вы просто пишете (в приведенном выше коде вместо):
источник
источник
Java 8
Files.walk(..)
хороша, когда вы недовольны, она не будет выбрасывать Avoid Java 8 Files.walk (..) причина завершения (java.nio.file.AccessDeniedException) .Вот безопасное решение, не столь элегантное, как Java 8
Files.walk(..)
:источник
источник
Просто чтобы расширить принятый ответ, я сохраняю имена файлов в ArrayList (вместо того, чтобы просто выгружать их в System.out.println), я создал вспомогательный класс «MyFileUtils», чтобы он мог быть импортирован другими проектами:
Я добавил полный путь к имени файла. Вы бы использовали это так:
ArrayList передается значением «value», но значение используется для указания на тот же объект ArrayList, который находится в куче JVM. Таким образом, каждый рекурсивный вызов добавляет имена файлов в один и тот же ArrayList (мы НЕ создаем новый ArrayList для каждого рекурсивного вызова).
источник
Вы можете указать путь к файлу в качестве аргумента и создать список со всеми путями к файлам, но не указывать его вручную. Затем используйте цикл for и читатель. Пример для текстовых файлов:
источник
источник
источник
источник
Вы можете отфильтровать любые текстовые файлы или любое другое расширение. Просто замените его на .MP3
источник
Есть много хороших ответов выше, вот другой подход: В проекте maven все, что вы помещаете в папку ресурсов, по умолчанию копируется в папку target / classes. Чтобы увидеть, что доступно во время выполнения
Теперь, чтобы получить файлы из определенной папки, скажем, у вас есть папка с именем res в папке ресурсов, просто замените:
Если вы хотите иметь доступ к пакету com.companyName, тогда:
источник
Это будет читать указанные файлы расширений файлов по указанному пути (также ищет подпапки)
источник
files container
?Это будет хорошо работать:
источник
Имея baseDir, перечисляет все файлы и каталоги под ним, написанные итеративно.
источник
чтобы исключить Nullpointerexceptions в функции listFiles () и рекурсивно получить все файлы из подкаталогов.
источник