Манипулирование файлами и каталогами в Java
View more Tutorials:
На самом деле, вы часто работаете с файлами и папками в системе, операции здесь включают добавление, удаление, переименование. Java дает вам два класса, чтобы сделать это:
- java.io.File
- java.nio.file.Files
java.io.File
Java.io.File класс представляет файл (file) или папку (directory) системы, он введен в Java, из версии 1.0
java.nio.file.Files
Версия 7.0, Java дополняет java.nio.file.Files класс, что позволяет легко манипулировать файлами и папками, все методы этого класса являются статическими и естественными (static and nature)
В этой статье я только говорю об использовании класса java.io.File, вы можете посмотреть больше про java.nio.file.Files по ссылке:
- TODO Link!
Java.io.File класс представляет файл или папку в системе, которая представляет путь (pathname). В следующем примере создается объект File представляющий путь в Windows, или Unix:
// Window File apath1 = new File("C:/mydocument/test.txt"); File apath2 = new File("C:/mydocument/java"); // Unix File apath3 = new File("/mydocument/test.txt"); File apath3 = new File("/mydocument/java");
java.io.File может представлять собой путь (pathname), где этот путь может на самом деле не существовать в системе. Если существовует, то может быть в виде папки (directory) или файла (file).
Следующий простой пример создает объект File, который представляет собой путь, и проверяет его существование, записывает основную информацию, если путь на самом деле существует:
FileInfoExample.java
package org.o7planning.filedirectory; import java.io.File; import java.util.Date; public class FileInfoExample { public static void main(String[] args) { // Создать объект File представлюящий путь. File apath = new File("C:/test/mytext.txt"); // Проверка существования. System.out.println("Path exists? " + apath.exists()); if (apath.exists()) { // Проверить является ли 'apath' папкой или нет? System.out.println("Directory? " + apath.isDirectory()); // Проверить является ли 'apath' скрытым путем или нет? System.out.println("Hidden? " + apath.isHidden()); // Простое название. System.out.println("Simple Name: " + apath.getName()); // Абсолютный путь. System.out.println("Absolute Path: " + apath.getAbsolutePath()); // Проверка размера файла (По единицам byte): System.out.println("Length (bytes): " + apath.length()); // Последнее изменение (в милисекундах) long lastMofifyInMillis = apath.lastModified(); Date lastModifyDate = new Date(lastMofifyInMillis); System.out.println("Last modify date: " + lastModifyDate); } } }



Класс File содержит два метода для создания:
Метод | Описание |
public boolean mkdir() | Создает папку данную путем. Заметьте, что папка создается только при существовании родительской папки. |
public boolean mkdirs() | Создает папку данную путем, включая родительскую папку если она не существует. |
MakeDirExample.java
package org.o7planning.filedirectory; import java.io.File; public class MakeDirExample { public static void main(String[] args) { File dir1 = new File("C:/test2/test3"); System.out.println("Pathname: " + dir1.getAbsolutePath()); System.out.println("Path Exists? " + dir1.exists()); System.out.println("Parent Path Exists? " + dir1.getParentFile().exists()); // С mkdir(), папка может быть создана только если существует родительская папка. boolean created = dir1.mkdir(); System.out.println("Directory created? " + created); System.out.println("--------------------"); File dir2 = new File("C:/test2/test3/test4"); System.out.println("Pathname: " + dir2.getAbsolutePath()); System.out.println("Exists? " + dir2.exists()); // created = dir1.mkdirs(); System.out.println("Directory created? " + created); } }

Java.io.File класс предлагает несколько способов, чтобы получить список подфайлов и подкаталогов в каталоге. И использует FileFilter для фильтрации файлов
Метод | Описание |
static File[] listRoots() |
Возвращает массив объектов File, который представляет корневой каталог. В операционной системе Windows это диски (C:, D :, ..) в Unix это /
|
File[] listFiles() |
Возвращает массив объектов File, файлы и подпапки из текущей папки, и соотствествующий фильтру FilenameFilter на параметр.
|
File[] listFiles(FilenameFilter filter) |
Возвращает массив объектов File, файлы и подпапки из текущей папки, и соответствует с фильтром FilenameFilter на параметр
|
File[] listFiles(FileFilter filter) | Возвращает массив объектов File, файлы и подпапки из текущей папки, а соответствует с фильтром FileFilter на параметр |
String[] list() | Возвращает массив путей, пути файлов и путь подпапок в текущей папке. |
String[] list(FilenameFilter filter) | Возвращает массив путей, пути файлов и путь подпапках текущей папки, и соответствует с фильтром FiltenameFilter на параметр |
Например, список всех корневых каталогов:
RootFilesExample.java
package org.o7planning.filedirectory; import java.io.File; public class RootFilesExample { public static void main(String[] args) { File[] roots = File.listRoots(); for(File root: roots) { System.out.println(root.getAbsolutePath()); } } }

В следующем примере составляется список всех файлов и подпапок в непосредственной папке:
FileListExample.java
package org.o7planning.filedirectory; import java.io.File; public class FileListExample { public static void main(String[] args) { System.out.println("File[] listFiles():\n"); File dir = new File("C:/test"); File[] children = dir.listFiles(); for (File file : children) { System.out.println(file.getAbsolutePath()); } System.out.println("\n-----------------------"); System.out.println("String[] list():\n"); String[] paths = dir.list(); for (String path : paths) { System.out.println(path); } } }

java.io.FileFilter
** FileFilter **
package java.io; @FunctionalInterface public interface FileFilter { boolean accept(File pathname); }
Простой пример ниже использует FileFilter, чтобы отфильтровать файлы в папке и имеющие расширенную часть"txt":
TxtFileFilter.java
package org.o7planning.filedirectory; import java.io.File; import java.io.FileFilter; public class TxtFileFilter implements FileFilter { // Только принимает 'pathname' как файл и имеет 'расширение' (extension) это txt. @Override public boolean accept(File pathname) { if (!pathname.isFile()) { return false; } if (pathname.getAbsolutePath().endsWith(".txt")) { return true; } return false; } }
FileFilterExample.java
package org.o7planning.filedirectory; import java.io.File; public class FileFilterExample { public static void main(String[] args) { File dir = new File("C:/test"); File[] txtFiles = dir.listFiles(new TxtFileFilter()); for (File txtFile : txtFiles) { System.out.println(txtFile.getAbsolutePath()); } } }

java.io.FilenameFilter
** FilenameFilter **
package java.io; @FunctionalInterface public interface FilenameFilter { /** * Tests if a specified file should be included in a file list. * * @param dir the directory in which the file was found. * @param name the name of the file. * @return <code>true</code> if and only if the name should be * included in the file list; <code>false</code> otherwise. */ boolean accept(File dir, String name); }
Пример использовния FilenameFilter:
TxtFilenameFilter.java
package org.o7planning.filedirectory; import java.io.File; import java.io.FilenameFilter; public class TxtFilenameFilter implements FilenameFilter { // Принимает пути (path) с окончаниями '.txt' @Override public boolean accept(File dir, String name) { if (name.endsWith(".txt")) { return true; } return false; } }
FilenameFilterExample.java
package org.o7planning.filedirectory; import java.io.File; public class FilenameFilterExample { public static void main(String[] args) { File dir = new File("C:/test"); File[] txtFiles = dir.listFiles(new TxtFilenameFilter()); for (File txtFile : txtFiles) { System.out.println(txtFile.getAbsolutePath()); } } }

Java.io.File класс предлагает несколько методов для перечисления папок и файлов, которые являются "прямым потомком" текущего каталога. В примере ниже, используется рекурсия для перечисления всех папок потомков (дети, внуки, ..) и потомок файла.
RecursiveFileExample.java
package org.o7planning.filedirectory; import java.io.File; public class RecursiveFileExample { private void fetchChild(File file) { System.out.println(file.getAbsolutePath()); if (file.isDirectory()) { File[] children = file.listFiles(); for (File child : children) { // Рекурсивный (Recursive) this.fetchChild(child); } } } public static void main(String[] args) { RecursiveFileExample example = new RecursiveFileExample(); File dir = new File("C:/test"); example.fetchChild(dir); } }

Используя методы rename() класса File, вы можете изменить имя (или путь) файла или каталога. Если вы измените и путь, убедитесь, что новый родительский каталог уже существует.
Переименование

Следующий простой пример, чтобы переименовать файл (или папку), но не изменить путь своего отца.
SimpleRenameExample.java
package org.o7planning.filedirectory; import java.io.File; public class SimpleRenameExample { public static void main(String[] args) { File srcFile = new File("C:/test/test2/abc.txt"); File destFile = new File("C:/test/test2/def.txt"); boolean renamed = srcFile.renameTo(destFile); System.out.println("Renamed: "+ renamed); } }
Переименование включая путь родителя:
Переименование и измение пути родителя, подобно действию "Cut" файла или папки в другую папку, а затем переименовать ее.
ПРИМЕЧАНИЕ: Для операционной системы Windows, метод File.rename() не будет работать, если вы измените путь с одной диска на другой.

RenameAndPathExample.java
package org.o7planning.filedirectory; import java.io.File; public class RenameAndPathExample { public static void main(String[] args) { // Исходный файл (Source file). File srcFile = new File("C:/test/test2/abc.txt"); // Файл назначения (Destination file). File destFile = new File("C:/test2/test3/defgh.txt"); if (!srcFile.exists()) { System.out.println("Src File doest not exists"); return; } // Создать родительскую папку файла назначения. destFile.getParentFile().mkdirs(); boolean renamed = srcFile.renameTo(destFile); System.out.println("Renamed: " + renamed); } }