Listfiles java не видит apk файлы
В примере используется try-with-resources, рекомендованный в руководстве API. Он гарантирует, что в любом случае поток будет закрыт.
getName() даст только имя файла в его каталоге, который может быть подкаталогом оригинала. Если вы планируете использовать эту информацию для поиска файлов, вы можете найти путь, заданный getPath() более полезным. Могу ли я использовать этот метод, чтобы найти все файлы определенного типа, например pdf или html, по всей моей системе? Меня беспокоит эффективность, достаточно ли это быстро для систем с тысячами файлов или есть лучшая альтернатива? @codeln Начиная с Java 8, производительность очень приемлема, вы не заметите ничего запоздалого. Это быстро, эффективно и достаточно для чтения, чтобы сделать вашу работу. Просто чтобы указать, что это только инициализировано один раз. Прекрасная рекурсия. Это как предзаказ путешествовать. Ницца. Этот ответ и все остальные, использующие функции Java 8, пренебрегают закрытием потока. Смотрите мой отдельный ответ для примера правильного способа использования Files.walk. Давайте не будем забывать об импорте здесь для тех, кто получает NoClassDefFoundError для объекта File. импорт java.io.File; Я думаю, что это будет печатать имена каталогов, а не имена файловВ Java 8 вы можете сделать это
который будет печатать все файлы в папке, исключая все каталоги. Если вам нужен список, выполните следующие действия:
Если вы хотите вернуть List<File> вместо List<Path> , просто нарисуйте его:
Вам также необходимо закрыть поток! В противном случае вы можете запустить исключение, сообщив вам, что слишком много файлов открыты. Подробнее читайте здесь.
Получение ошибки с .map (Path :: toFile) Также .forEach (путь -> System.out.println (path.toString ()); должен быть .forEach (путь -> System.out.println (path.toString ( ))); Спасибо за исправление. Какая у вас ошибка? Я выполняю точный код в моем проекте и не получаю ошибку. Там написано: «Недопустимая ссылка на метод, не удается найти символ» У меня была та же проблема, но автоматический импорт импортировал что-то другое, а не java.nio.file.Path. и применить фильтр имен файлов (например, по расширению, используя String.endsWith ()) после этого тоже очень легко, спасибо! Похоже, ваш компилятор Java установлен на 1.7. Увеличьте его до 1.8 и / или установите новую версию вашей IDE. @JulianLiebl как мы пропускаем скрытые файлы? filter(Files::isHidden) не работает. Ошибка говорит: «Необработанное исключение типа IOException», но метод уже выбрасывает IOException. @NadjibMami Пожалуйста, посмотрите здесь: razem.io/blog/posts/year2015/0819_try_catch_lambda Был составлен, чтобы ответить в комментарии. Так что я написал быстрый пост в блоге. @JulianLiebl Вот это круто. Спасибо за ваши усилия, это действительно помогает! Вы можете написать forEach как .forEach(System.out::println) . Также .collect(Collectors.toList()) не нужен в вашем первом примере. @YingYang Я обновил ответ, чтобы решить ваши проблемы. Если кто-то все еще ищет тему «Попробуй поймать лямбду», URL моего блога был изменен -> razem.io/blog/y2015/0819_try_catch_lambda.html Как закрыть поток, если ваш код подобен второму примеру кода: List <File> filesInFolder = Files.walk (Paths.get ("/ path / to / folder")) .filter (Files :: isRegularFile) .map (Path :: toFile) .collect (Collectors.toList ()); <Код>Все ответы на эту тему, которые используют новые функции Java 8, пренебрегают закрытием потока. Пример в принятом ответе должен быть:
Из javadoc метода Files.walk :
Вы никогда не должны повторяться с потоком. Вы берете ссылку на поток, используете его и через него прочь. Я имею в виду, что правильно использовать это следующим образом: Files.walk (Paths.get ("/ home / you / Desktop")). Filter (Files :: isRegularFile) .forEach (filePath -> . ) Это решение для Android для чтения всех файлов и папок с SDCard или внутренней памяти. Согласен, просто опубликовать блок кода не получится. По крайней мере, добавьте несколько комментариев в код .Возвращенный поток инкапсулирует один или несколько DirectoryStreams. Если требуется своевременная утилизация ресурсов файловой системы, конструкция try-with-resources должна использоваться для обеспечения того, чтобы метод закрытия потока вызывается после завершения операций потока.
Вы также можете создать фильтр, который затем может быть передан методу newDirectoryStream выше
Я смущен примером создания фильтра. Что такое newDirectoryStream.Filter <Path>. Можете ли вы показать, как это заявлено?Просто пройдите через все файлы, используя Files.walkFileTree (Java 7)
Обратите внимание, что этот код будет генерировать исключение (и не сообщать о каких-либо дополнительных файлах), если для какого-либо файла или каталога атрибуты файла не могут быть прочитаны, например, из-за разрешений. Легко воспроизводить на `C:`.Если вы хотите больше параметров, вы можете использовать эту функцию, которая предназначена для заполнения массива файлов, находящихся в папке. Возможны следующие варианты: рекурсивность и шаблон для соответствия.
Пока я согласен с Rich, Orian и остальные для использования:
по какой-то причине все примеры здесь используют абсолютный путь (т.е. от корня или, скажем, буквы диска (C: \) для окон..)
Я хотел бы добавить, что возможно использовать относительный путь. Итак, если вы pwd (текущий каталог/папка) - папка1, и вы хотите проанализировать папку folder1/subfolder, вы просто пишете (в коде выше, а не):
Простой пример, который работает с Java 1.7 для рекурсивного отображения файлов в каталогах, указанных в командной строке:
Я думаю, что это хороший способ прочитать все файлы в папке и подпапках
Вот безопасное решение, хотя и не столь элегантное, как Java 8 Files.walk(..) :
Возможно, вы захотите добавить объяснение того, чего вы пытаетесь достичь, вместо того, чтобы показывать только код. Кроме того, myarray=new File[10]; не требуется, так как будет перезаписано следующей строкой!Одно замечание по получению всех файлов в каталоге.
Метод Files.walk(path) будет возвращать все файлы путем Files.walk(path) файлового дерева с корнем в данном запущенном файле.
Например, существует следующее дерево файлов:
Дает следующий результат:
Чтобы получить все файлы только в текущем каталоге, используйте java.nio.file.Files.list(Path) :
Имея baseDir, перечисляет все файлы и каталоги под ним, написанные итеративно.
Вы можете поместить путь к аргументу и создать список со всеми файловыми путями и не поместить его в список вручную. Затем используйте цикл for и считыватель. Пример для файлов txt:
Это будет нормально работать:
Это будет чтение заданных файлов расширения файлов в указанном пути (также выглядит вспомогательные папки)
Извините, если это нубский вопрос, но что я должен передать как files container ?Теперь, чтобы получить файлы из определенной папки, скажем, у вас есть папка с именем "res" в папке ресурсов, просто замените:
Просто для того, чтобы расширить принятый ответ, я сохраняю имена файлов в ArrayList (вместо того, чтобы просто отбрасывать их на System.out.println). Я создал вспомогательный класс "MyFileUtils", чтобы он мог быть импортирован другими проектами:
Я добавил полный путь к имени файла. Вы бы использовали его следующим образом:
ArrayList передается по "value", но значение используется для указания на тот же объект ArrayList, который живет в JVM Heap. Таким образом, каждый вызов рекурсии добавляет имена файлов в один и тот же ArrayList (мы НЕ создаем новый ArrayList для каждого рекурсивного вызова).
Метод listFiles () является частью класса File. Функция возвращает массив Files, обозначающий файлы с заданным абстрактным путем, если имя пути является каталогом, иначе возвращает ноль. Функция перегружена. Одна из функций не имеет параметров, вторая функция принимает объект FilenameFilter в качестве параметра, третья функция принимает объект FileFilter в качестве параметра
Подпись функции:
Синтаксис функции:
Параметры: функция перегружена
- Одна из функций не имеет параметров,
- Вторая функция принимает объект FilenameFilter в качестве параметра,
- Третья функция принимает объект FileFilter в качестве параметра
Возвращаемое значение: функция возвращает массив файлов или нулевое значение, если объект файла является файлом.
Исключение: этот метод генерирует исключение безопасности, если функция не имеет права на чтение файла
Ниже программы проиллюстрируют использование функции listFiles ()
Пример 1. Мы попытаемся найти все файлы и каталоги в данном каталоге.
// Java-программа для демонстрации
// использование функции listFiles ()
public class solution
public static void main(String args[])
// блок try-catch для обработки исключений
// Создать файловый объект
File f = new File( "f:\\program" );
// Получить все имена присутствующих файлов
// в данном каталоге
File[] files = f.listFiles();
// Отображаем имена файлов
for ( int i = 0 ; i < files.length; i++)
catch (Exception e)
Выход:
Пример 2: Мы попытаемся найти все файлы и каталоги в данном каталоге, имена которых начинаются с «12»
// Java-программа для демонстрации
// использование функции listFiles ()
public class solution
public static void main(String args[])
// блок try-catch для обработки исключений
// Создать файловый объект
File f = new File( "f:\\program" );
FilenameFilter filter = new FilenameFilter()
public boolean accept(File f, String name)
return name.startsWith( "12" );
// Получить все имена присутствующих файлов
// в данном каталоге
// и чьи имена начинаются с "12"
File[] files = f.listFiles(filter);
// Отображаем имена файлов
for ( int i = 0 ; i < files.length; i++)
catch (Exception e)
Выход:
Пример 3: Мы попытаемся найти все файлы и каталоги в данном каталоге, которые являются текстовыми файлами
// Java-программа для демонстрации
// использование функции listFiles ()
public class solution
public static void main(String args[])
// блок try-catch для обработки исключений
// Создать файловый объект
File f = new File( "f:\\program" );
FileFilter filter = new FileFilter()
public boolean accept(File f)
return f.getName().endsWith( "txt" );
// Получить все имена присутствующих файлов
// в данном каталоге
// которые являются текстовыми файлами
File[] files = f.listFiles(filter);
// Отображаем имена файлов
for ( int i = 0 ; i < files.length; i++)
catch (Exception e)
Выход:
Программы могут не работать в онлайн-среде IDE. пожалуйста, используйте автономную IDE и установите родительский файл файла
3 ответа
Я работаю над небольшой базовой программой GUI, которая получает файлы из моих ресурсов, получает имена файлов и помещает их в поле со списком. например, у меня просто есть файл внутри того же пакета под названием images и я пытаюсь получить имена файлов. я получаю файл, используя getResoure() вот.
Похоже, что метод listFiles() также перечисляет все каталоги и представляет все результаты как каталоги.
Может быть, вам стоит попробовать метод walkFileTree из NIO.2:
Чтобы использовать NIO.2, у вас должна быть как минимум версия Java 1.7.
Я попробовал это как:
У меня нет проблем с вашим кодом, но вы можете столкнуться с проблемами с "symbolic links" (например, с "My Documents" на Windows), которые, хотя они кажутся каталогами, Java не может их решить, и вызов listXxx вернет null .
Сказав это, вы также можете попробовать использовать что-то вроде.
вместо этого перечислите файлы и каталоги.
Я считаю, что новый nio2 ( Files и Paths API) имеет решение для этого.
Итак, у меня есть ListView, который отображает имена всех файлов в определенном каталоге. Это приложение также удаляет файлы и добавляет новые файлы в каталог. Я бы хотел, чтобы файлы отображались в порядке их создания, но это не всегда верно для файла( каталога ).listFiles(). Если я начну с.
Похожие вопросы:
Я хочу прочитать все файлы из моего пакета, не используя весь путь к файлу. Например, я могу использовать что-то вроде этого, чтобы получить все файлы в dir. new.
Есть ли какой-нибудь способ использовать listFiles() в каталоге, который был упакован в jar? Допустим, у меня есть каталог в моем каталоге ресурсов с некоторыми текстовыми файлами: texts/text1.txt и.
Итак, у меня есть эта программа, где я хочу получить текущий список файлов в каталоге, где выполняется файл Java. Вот вам и звонок: File q1 = new File(System.getProperty(user.dir)); File[].
Я работаю над небольшой базовой программой GUI, которая получает файлы из моих ресурсов, получает имена файлов и помещает их в поле со списком. например, у меня просто есть файл внутри того же.
Похоже, что метод listFiles() также перечисляет все каталоги и представляет все результаты как каталоги.
Итак, у меня есть ListView, который отображает имена всех файлов в определенном каталоге. Это приложение также удаляет файлы и добавляет новые файлы в каталог. Я бы хотел, чтобы файлы отображались в.
Когда я пытаюсь использовать метод someFile.listFiles(FileFilter foobar) , я получаю ошибку Метод listFiles (FilenameFilter) в файле типа не применим для Аргументов (FileFilter) А у javadoc файла.
Я работаю над игрой libgdx , используя tiled для создания карт, на моем экране выбора уровня я читаю все файлы в папке map и считаю файлы, заканчивающиеся на .tmx , чтобы увидеть, сколько кнопок.
Я заметил, что метод listFiles() возвращает файлы, а также каталоги, однако я хотел бы заполнить свой массив filePath только файлами. Я знаю, что есть метод isFile() , но я не знаю, как объединить.
документация File.listFiles() говорит о том, что null будет возвращен только в том случае, если вызывающий его файл не является каталогом.
у меня есть следующие:
почему-то, listFiles( ) возвращает null хотя File распознается как допустимый каталог. Я не очень хорошо знаком с поведением иерархии файлов Android, поэтому я бы предположил, что проблема заключается в там.
для справки, я отлаживаю на своем Moto X, и результаты одинаковы, подключен ли телефон к моему компьютеру или нет, поэтому я не думаю, что это связано с установкой при подключении.
для тех, у кого есть эта проблема, добавьте это в AndroidManifest.XML-код:
проблема решена: D
EDIT: если это не работает, просто убедитесь, что путь правильный
для тех, у кого есть эта проблема, чтобы дать разрешение на чтение, добавьте это в AndroidManifest.XML-код:
и вы также должны предоставить разрешение от
Настройки > Приложения > "название" > разрешения > для хранения
для android версии 23 или выше, вы должны дать выполнить разрешение времени программно в методе onresume как ниже
из документации по методу "listFiles": возвращает null, если этот абстрактный путь не обозначает каталог или если возникает ошибка ввода-вывода.
возможно, произошла ошибка ввода-вывода. Проверьте разрешения на этот каталог, имеет ли пользователь, выполняющий программу java, разрешение на чтение этого каталога? Если нет, вот ваш ответ. Если да, то, возможно, каталог пуст.
кстати, вы не должны использовать +"", чтобы преобразовать что-то в строку, то это плохо практикуйте, так как это медленнее, чем строка.метод valueOf. Я бы использовал StringUtils apache для объединения этого массива в строку, но для этого требуется добавить этот jar в ваш путь к классам.
просто добавьте разрешение в manifest uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" и ваша проблема будет решена.
моя проблема заключалась в том, что по какой-то причине android:sharedUserId="android.идентификатор uid.атрибут "система" не позволял приложению читать /sdcard/ на определенном устройстве.
поскольку мне нужно было сделать только быстрый тест, я удалил атрибут sharedUserId, протестировал и добавил его обратно.
в файле манифеста в добавить строку android:name="android.permission.READ_EXTERNAL_STORAGE" . Думаю, это решит вашу проблему.
У меня была такая же проблема в java, но не в android, где я читаю конфигурационный файл с путем в кавычках. Я решил свою проблему, просто удалив кавычки
таким образом, Вы можете сделать это с помощью функции замены строки или дать ее без кавычек
В отличие от большинства классов ввода/вывода, класс File работает не с потоками, а непосредственно с файлами. Данный класс позволяет получить информацию о файле: права доступа, время и дата создания, путь к каталогу. А также осуществлять навигацию по иерархиям подкаталогов.
Класс java.io.File может представлять имя определённого файла, а также имена группы файлов, находящихся в каталоге. Если класс представляет каталог, то его метод list() возвращает массив строк с именами всех файлов.
Для создания объектов класса File можно использовать один из следующих конструкторов.
- File(File dir, String name) - указывается объекта класса File (каталог) и имя файла
- File(String path) - указывается путь к файлу без указания имени файла
- File(String dirPath, Sring name) - указывается путь к файлу и имя файла
- File(URI uri) - указывается объекта URI, описывающий файл
Методы класса File
Класс File может использоваться для создания каталога или дерева каталогов. Также можно узнать свойства файлов (размер, дату последнего изменения, режим чтения/записи), определить к какому типу (файл или каталог) относится объект File, удалить файл. У класса очень много методов, перечислим некоторые.
- getAbsolutePath() - абсолютный путь файла, начиная с корня системы. В Android корневым элементом является символ слеша (/)
- canRead() - доступно для чтения
- canWrite() - доступно для записи
- exists() - файл существует или нет
- getName() - возвращает имя файла
- getParent() - возвращает имя родительского каталога
- getPath() - путь
- lastModified() - дата последнего изменения
- isFile() - объект является файлом, а не каталогом
- isDirectory - объект является каталогом
- isAbsolute() - возвращает true, если файл имеет абсолютный путь
- renameTo(File newPath) - переименовывает файл. В параметре указывается имя нового имени файла. Если переименование прошло неудачно, то возвращается false
- delete() - удаляет файл. Также можно удалить пустой каталог
Каталог
Каталог - это объект класса File, который содержит список других файлов и каталогов. После создания объекта класса File, являющего каталогом, его метод isDirectory() вернёт значение true. И тогда вы можете вызывать метод list().
Для создания каталога можно использовать метод mkdir(), который вернёт true в успешном случае. Если указанный путь уже существует или каталог нельзя создать из-за отсутствия полного пути к нему, то вернётся false.
Метод mkdirs() создаёт сам каталог, так и всех его родителей.
Список каталогов
Если вы хотите получить содержимое каталога, то можно вызвать метод list() без аргументов. Вам вернётся полный список (массив) имён файлов и каталогов, содержащихся в данном каталоге. Есть ещё похожий метод listFiles(), который возвращает массив файлов (объектов, а не их имён), о котором поговорим отдельно.
Если вам нужен только список файлов с расширением .java, то можно использовать специальный фильтр-класс, который описывает критерии отбора объектов File с помощью интерфейса FilenameFilter.
Интерфейс FilenameFilter определяет единственный метод accept(), вызываемый по одному разу с каждым файлом в списке.
Метод возвращает true для файлов каталога, указанного в dir, которые должны быть включены в список, и false - для файлов, которые следует исключить.
Метод listFiles()
Метод имеет несколько перегруженных версий. Он возвращает список файлов в виде массива объектов класса File. Одна из версий метода также использует интерфейс FilenameFilter. Другая версия использует интерфейс FileFilter и возвращает те файлы, путевые имена которых соответствует интерфейсу.
Пример использования методов класса File показан в уроке Файловый менеджер и в других примерах.
Читайте также: