Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

Как обойти все файлы в папке и подпапках и прочитать текстовые файлы в массив?

#java


Мне нужно поочередно считать текст из текстовых файлов (.txt), которые находятся
в папке и сохранить в array.

Пример:

                    Корневая Папка
                /         |         \
        Папка А       Папка Б     Папка В 
      /    |    \     / | \      /    |    \ 
 1.txt  2.txt  3.txt  . . .  n-2.txt  n-1.txt  n.txt


Подскажите, пожалуйста, как это реализовать.
    


Ответы

Ответ 1



Давайте попробую ответить в меру своего понимания. (1) Обход файлов. Есть два способа — традиционный и простой, и модный и прикольный, но сложный. Традиционный способ заключается в применении рекурсии: public void processFilesFromFolder(File folder) { File[] folderEntries = folder.listFiles(); for (File entry : folderEntries) { if (entry.isDirectory()) { processFilesFromFolder(entry); continue; } // иначе вам попался файл, обрабатывайте его! } } Модный метод — применение Streams API: Files.walk(Paths.get("ваш каталог тут")) .filter(Files::isRegularFile) .map(Path::toFile) .collect(Collectors.toList()) Или если вам нужны только пути, то просто Files.walk(Paths.get("ваш каталог тут")) .filter(Files::isRegularFile) .collect(Collectors.toList()) Применяйте, если для вас слово «лямбда» означает больше, чем название греческой буквы. (2) Чтение файла в строку. Применяйте вот какую конструкцию: byte[] bytes = Files.readAllBytes(Paths.get(path)); String content = new String(bytes, encoding); При этом вы, понятно, должны знать кодировку файла (вы ведь понимаете, что текстовый файл без кодировки — нонсенс?). В качестве возможных кодировок — StandardCharsets.UTF_8 для UTF-8. Ну или может подойти Charset.defaultCharset(). (3) Ну и по поводу записи в массив есть своя тонкость. Когда вы обходите каталог, вам неизвестно, сколько файлов в нём окажется. Поэтому вы не можете выделить под них массив нужного размера. Поэтому лучше собирать данные в список (например, ArrayList), который умеет автоматически расти. И работать по сути тоже лучше со списком. Если тем не менее вам понадобится именно массив, можно сконвертировать список в массив, например, так: String[] array = list.toArray(new String[0]);

Ответ 2



Всё просто. Первым делом обойдите все поддиректории и файлы в них. Итератор, например, можно взять из FileUtils (или оттуда же listFiles, смотря что нужно). Считайте каждый файл в строку. Собственно, нужные методы тоже есть в FileUtils. Добавить в массив каждую строчку, надеюсь, проблемы не составит.

Комментариев нет:

Отправить комментарий