Автор оригинала: Marko Petrović.
Вступление
Многие приложения каким-то образом обрабатывают файлы, и манипулирование файлами является одним из основных знаний на любом языке программирования.
Чтобы манипулировать файлами, нам нужно знать, где они находятся. Наличие обзора файлов в каталоге имеет первостепенное значение, если мы хотим этого добиться, особенно если мы можем выполнять операции с ними с помощью итерации. В Java есть несколько способов сделать это, которые мы покажем в этой статье.
Для простоты все примеры будут написаны для следующего дерева файлов:
Programming |-- minimax.c |-- super_hack.py |-- TODO.txt `-- CodingMusic |-- Girl Talk - All Day.mp3 |-- Celldweller - Frozen.mp3 |-- Lim Taylor - Isn't It Wonderful.mp3 `-- Radiohead - Everything in Its Right Place.mp3
Файл.список()
Самым простым методом для перечисления имен файлов и папок в заданном каталоге без обхода подкаталогов является вспомогательный метод .list ()
, который возвращает массив String
s.
Мы делаем это с помощью метода .list()
в экземпляре Файла
:
public class Pathnames { public static void main(String[] args) { // Creates an array in which we will store the names of files and directories String[] pathnames; // Creates a new File instance by converting the given pathname string // into an abstract pathname File f = new File("D:/Programming"); // Populates the array with names of files and directories pathnames = f.list(); // For each pathname in the pathnames array for (String pathname : pathnames) { // Print the names of files and directories System.out.println(pathname); } } }
Используя простой цикл для каждого , мы перебираем массив и выводим Строку
s.
CodingMusic minimax.c super_hack.py TODO.txt
При использовании этого подхода все элементы в каталоге Кодирование музыки
не отображаются, и недостатком этого подхода является то, что мы действительно ничего не можем сделать с самими файлами. Мы только узнаем их имена. Это полезно, когда мы просто хотим взглянуть на файлы по номиналу.
Фильтр имен файлов
Еще одна вещь, которую мы можем сделать с помощью метода .list ()
, – это создать Фильтр имен файлов
для возврата только тех файлов, которые мы хотим:
File f = new File("D:/Programming"); // This filter will only include files ending with .py FilenameFilter filter = new FilenameFilter() { @Override public boolean accept(File f, String name) { return name.endsWith(".py"); } }; // This is how to apply the filter pathnames = f.list(filter);
Запуск этого фрагмента кода приведет к:
super_hack.py
Файл.listFiles()
Подобно предыдущему методу, этот метод можно использовать для возврата имен файлов и каталогов, но на этот раз мы получаем их в виде массива объектов File
, что дает нам возможность напрямую манипулировать ими:
public class Pathnames { public static void main(String args[]) { // try-catch block to handle exceptions try { File f = new File("D:/Programming"); FilenameFilter filter = new FilenameFilter() { @Override public boolean accept(File f, String name) { // We want to find only .c files return name.endsWith(".c"); } }; // Note that this time we are using a File class as an array, // instead of String File[] files = f.listFiles(filter); // Get the names of the files by using the .getName() method for (int i = 0; i < files.length; i++) { System.out.println(files[i].getName()); } } catch (Exception e) { System.err.println(e.getMessage()); } } }
Выход:
minimax.c
Теперь давайте углубимся в файловую систему, используя рекурсию и еще несколько методов для использования с Файлом
объектом:
public class ListFilesRecursively { public void listFiles(String startDir) { File dir = new File(startDir); File[] files = dir.listFiles(); if (files != null && files.length > 0) { for (File file : files) { // Check if the file is a directory if (file.isDirectory()) { // We will not print the directory name, just use it as a new // starting point to list files from listDirectory(file.getAbsolutePath()); } else { // We can use .length() to get the file size System.out.println(file.getName() + " (size in bytes: " + file.length()+")"); } } } } public static void main(String[] args) { ListFilesRecursively test = new ListFilesRecursively(); String startDir = ("D:/Programming"); test.listFiles(startDir); } }
Выход:
Girl Talk - All Day.mp3 (size in bytes: 8017524) Celldweller - Frozen.mp3 (size in bytes: 12651325) Lim Taylor - Isn't It Wonderful.mp3 (size in bytes: 6352489) Radiohead - Everything in Its Right Place.mp3 (size in bytes: 170876098) minimax.c (size in bytes: 20662) super_hack.py (size in bytes: 114401) TODO.txt (size in bytes: 998)
Файлы.прогулка()
В Java 8 и более поздних версиях мы можем использовать файл java.nio.Файлы
класс для заполнения потока
и использования его для просмотра файлов и каталогов и в то же время рекурсивного обхода всех подкаталогов.
Обратите внимание, что в этом примере мы будем использовать лямбда-выражения:
public class FilesWalk { public static void main(String[] args) { try (Streamwalk = Files.walk(Paths.get("D:/Programming"))) { // We want to find only regular files List result = walk.filter(Files::isRegularFile) .map(x -> x.toString()).collect(Collectors.toList()); result.forEach(System.out::println); } catch (IOException e) { e.printStackTrace(); } } }
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
Здесь мы заполнили Поток
, используя метод .walk ()
, передав аргумент Пути|/. Класс
Пути состоит из статических методов , которые возвращают
Путь на основе строкового URI - и, используя
Путь , мы можем легко найти файл.
Путь
, Пути
, Файлы
и многие другие классы принадлежат пакету java.nio
, который был представлен в Java 7 как более современный способ представления файлов неблокирующим способом.
Затем с помощью Collections Framework создается список.
Запуск этого фрагмента кода приведет к:
D:\Programming\Coding Music\Radiohead - Everything in Its Right Place.mp3 D:\Programming\Coding Music\Lim Taylor - Isn't It Wonderful.mp3 D:\Programming\Coding Music\Celldweller - Frozen.mp3 D:\Programming\Coding Music\Girl Talk - All Day.mp3 D:\Programming\minimax.c D:\Programming\super_hack.py D:\Programming\TODO.txt
Вывод
Обработка файлов каким-либо образом является основной задачей для большинства языков программирования, и это включает в себя возможность перечислять и находить файлы в файловой системе. Чтобы манипулировать файлами, нам нужно знать, где они находятся. Наличие обзора файлов в каталоге имеет первостепенное значение, если мы хотим этого добиться, особенно если мы можем выполнять операции с ними с помощью итерации.
В этой статье мы показали несколько различных способов в Java перечисления файлов в файловой системе, используя как линейный, так и рекурсивный подходы.