Манипулирование файлами и каталогами в Java
1. Обзор
На самом деле, вы часто работаете с файлами и папками в системе, операции здесь включают добавление, удаление, переименование. 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 по ссылке:
- Thao tác với tập tin và thư mục sử dụng Java NIO Files
2. java.io.File
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);
}
}
}
3. Создать каталог
Класс 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);
}
}
4. Фильтр File
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());
}
}
}
5. Перечисление всех подпапок
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);
}
}
6. Переименование
Используя методы 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);
}
}
Java Basic
- Настройте java compiler для обработки вашего Annotation (Annotation Processing Tool)
- Программирование на Java для группы с помощью Eclipse и SVN
- Руководство Java WeakReference
- Руководство Java PhantomReference
- Сжатие и декомпрессия в Java
- Настройка Eclipse для использования JDK вместо JRE
- Методы String.format() и printf() в Java
- Синтаксис и новые функции в Java 8
- Регулярные выражения Java
- Руководство Java Multithreading Programming
- Библиотеки Java JDBC Driver для различных типов баз данных
- Руководство Java JDBC
- Получить значения столбцов, автоматически возрастающих при вставлении (Insert) записи, используя JDBC
- Руководство Java Stream
- Руководство Java Functional Interface
- Введение в Raspberry Pi
- Руководство Java Predicate
- Абстрактный класс и Interface в Java
- Модификатор доступа (Access modifiers) в Java
- Руководство Java Enum
- Руководство Java Annotation
- Сравнение и Сортировка в Java
- Руководство Java String, StringBuffer и StringBuilder
- Обработка исключений Java - Java Exception Handling
- Руководство Java Generics
- Манипулирование файлами и каталогами в Java
- Руководство Java BiPredicate
- Руководство Java Consumer
- Руководство Java BiConsumer
- Что мне нужно для начала работы с Java?
- История Java и разница между Oracle JDK и OpenJDK
- Установить Java в Windows
- Установите Java в Ubuntu
- Установите OpenJDK в Ubuntu
- Установить Eclipse
- Установите Eclipse в Ubuntu
- Быстрое изучение Java для начинающих
- История бит и байтов в информатике
- Типы данных в java
- Битовые операции
- Команда if else в Java
- команды switch в Java
- Циклы в Java
- Массивы (Array) в Java
- JDK Javadoc в формате CHM
- Наследование и полиморфизм в Java
- Руководство Java Function
- Руководство Java BiFunction
- Пример Java encoding и decoding с использованием Apache Base64
- Руководство Java Reflection
- Java Удаленный вызов методов - Java RMI
- Руководство Программирование Java Socket
- Какую платформу я должен выбрать для разработки приложений Java Desktop?
- Руководство Java Commons IO
- Руководство Java Commons Email
- Руководство Java Commons Logging
- Понимание Java System.identityHashCode, Object.hashCode и Object.equals
- Руководство Java SoftReference
- Руководство Java Supplier
- Аспектно-ориентированное программирование Java с помощью AspectJ (AOP)
Show More
- Руководства Java Servlet/JSP
- Руководства Java Collections Framework
- Java API для HTML, XML
- Руководства Java IO
- Руководства Java Date Time
- Руководства Spring Boot
- Руководства Maven
- Руководства Gradle
- Руководства Java Web Services
- Руководства Java SWT
- Руководства JavaFX
- Руководства Oracle Java ADF
- Руководства Struts2 Framework
- Руководства Spring Cloud