Java Files – Класс java.nio.file.Files

Класс Java Files был введен в Java 1.7 и является частью пакета java.nio.file.

Класс Java Files

  • Класс Java Files содержит статические методы, которые работают с файлами и каталогами.
  • Этот класс используется для основных операций с файлами, таких как создание, чтение, запись, копирование и удаление файлов или каталогов файловой системы.

Прежде чем двигаться дальше, давайте сначала рассмотрим нижеприведенные термины:

  1. Path: Это интерфейс, который заменяет класс java.io.File в качестве представления файла или каталога при работе в Java NIO.
  2. Paths: Этот класс содержит статический метод для создания экземпляра Path.

java.nio.file.Path интерфейс похож на старый класс java.io.File. Path представляет местоположение файла, и когда мы создаем путь к новому файлу, фактический файл не создается, пока мы его не создадим с использованием Files.createFile(Path filePath). Как видно на диаграмме выше, класс Paths используется для создания экземпляра Path, а класс Files использует экземпляр Path для работы с файлом. Объекты File и Path знают, как преобразовываться друг в друга, вот как мы можем использовать старый код для взаимодействия с новой утилитой Files.

Java IO против NIO

Как создать путь

Мы можем создать объект Path, вызвав метод Paths.get(String first, String... more) класса Paths.

Path path1 = Paths.get("/tmp/file.txt"); // For UNIX

Path path2 = Paths.get("D:/data/file.txt"); // For Windows

Мы также можем создать объект Path, разделяя части пути в методе Paths.get().

Path path1 = Paths.get("/tmp", "file.txt");

Path path2 = Paths.get("D:", "data", "file.txt");

Path path3 = Paths.get("D:/data", "file.txt") ;

Как видно, мы можем передавать имя папки и имя файла в метод Paths.get() отдельно.

Методы файлов Java

Класс Java NIO Files содержит статические методы, которые используются для манипулирования файлами и каталогами, и эти методы в основном работают с объектом Path. Давайте рассмотрим ниже перечисленные методы класса Files:

  1. copy(InputStream in, Path target, CopyOption… options): Этот метод копирует все байты из указанного входного потока в указанный целевой файл и возвращает количество прочитанных или записанных байтов в виде длинного значения.
  2. copy(Path source, OutputStream out): Этот метод копирует все байты из указанного исходного файла в заданный выходной поток и возвращает количество прочитанных или записанных байтов в виде длинного значения.
  3. copy(Path source, Path target, CopyOption… options): Этот метод копирует указанный исходный файл в указанный целевой файл и возвращает путь к целевому файлу.
  4. createDirectories(Path dir, FileAttribute<?>… attrs): Этот метод создает каталоги с использованием указанного пути, создавая сначала все отсутствующие родительские каталоги. Этот метод не будет генерировать исключение, если каталог не может быть создан, потому что он уже существует. FileAttribute – необязательный параметр для автоматической установки при создании отсутствующих каталогов, и он возвращает путь созданного каталога.
  5. createDirectory(Path dir, FileAttribute Этот метод создает каталог с заданным путем, если каталог создается успешно, он вернет путь созданного каталога. Если каталог уже существует, то будет сгенерировано исключение nio.file.FileAlreadyExistsException.
  6. createFile(Path path, FileAttribute Этот метод создает новый пустой файл с заданным путем и возвращает путь к только что созданному файлу, если он создается успешно. Если файл уже существует, то будет сгенерировано исключение nio.file.FileAlreadyExistsException.
  7. createTempDirectory(Path dir, String prefix, FileAttribute Этот метод создает временный каталог с заданным путем и генерирует имя каталога с заданным префиксом. Он вернет путь к только что созданному временному каталогу.
  8. createTempDirectory(String prefix, FileAttribute Этот метод создает временный каталог в ​​каталоге временных файлов по умолчанию и генерирует имя каталога с заданным префиксом. Он вернет путь к только что созданному временному каталогу, который связан с файловой системой по умолчанию.
  9. createTempFile(Path dir, String prefix, String suffix, FileAttribute Этот метод создает временный файл в указанном каталоге, генерирует имя файла с заданным префиксом и суффиксом, и возвращает путь к только что созданному файлу.
  10. createTempFile(String prefix, String suffix, FileAttribute<?>… attrs): Этот метод создает временный файл в каталоге временных файлов по умолчанию и генерирует имя файла, используя заданный префикс и суффикс, затем возвращает путь к только что созданному файлу.
  11. delete(Path path): Это метод типа void и просто удаляет файл из указанного пути. Этот метод генерирует исключение NoSuchFileException, если файл не существует по указанному пути, и если файл является каталогом, который может быть не пустым и не может быть удален, в этом случае будет сгенерировано исключение
  12. deleteIfExists(Path path): Этот метод проверяет, существует ли файл перед удалением, и возвращает логическое значение true, если файл по указанному пути успешно удален, и false, если файл не существует по указанному пути. Если файл является каталогом, который может быть не пустым и не может быть удален, в этом случае будет сгенерировано исключение
  13. exists(Path path): Этот метод проверяет, существует ли файл по указанному пути, и если файл существует, он возвращает true, в противном случае возвращает false.
  14. getLastModifiedTime(Path path, Linkoption… options): Этот метод возвращает время последнего изменения файла по заданному пути как
  15. getOwner(Path path, Linkoption… options): Этот метод возвращает UserPrincipal, представляющего владельца файла по заданному пути.
  16. isDirectory(Path path, LinkOption… options): Этот метод проверяет, является ли файл каталогом по указанному пути. Возвращает true, если файл является каталогом, и false, если файл не существует, не является каталогом или невозможно определить, является ли файл каталогом или нет.
  17. isExecutable(Path path): Этот метод проверяет, является ли файл по указанному пути исполняемым, а также проверяет, существует ли файл, и имеет ли эта JVM соответствующие привилегии для выполнения файла. Возвращает true, если файл существует по указанному пути, и он исполняем, и false, если файл не существует, или у JVM нет достаточных привилегий для выполнения файла, или невозможно определить доступ.
  18. isHidden(Path path): Этот метод определяет, считается ли файл по указанному пути скрытым или нет. Точное определение скрытости зависит от платформы или провайдера. В случае UNIX-системы файл считается скрытым, если имя файла начинается с символа точки (‘.’). В случае WINDOWS файл считается скрытым, если он не является каталогом и установлен атрибут DOS Hidden. Возвращает true, если файл по указанному пути считается скрытым, иначе false.
  19. isReadable(Path path): Этот метод проверяет, читаем ли файл по указанному пути или нет. Возвращает true, если файл по указанному пути существует и читаем, и false, если файл не существует, доступ к чтению запрещен из-за недостаточных привилегий JVM или невозможно определить доступ.
  20. isWritable(Path path): Этот метод проверяет, можно ли записать файл по указанному пути или нет. Он возвращает true, если файл по указанному пути существует и доступен для записи, и false, если файл не существует или доступ к записи запрещен из-за недостаточных привилегий в JVM или невозможности определить доступ.
  21. move(Path source, Path target, CopyOption… options): Этот метод перемещает или переименовывает исходный файл в целевой файл и возвращает путь целевого файла. Параметр опции может включать следующее: REPLACE_EXISTING: Это означает, что если целевой файл существует, то он заменяется, если это не является непустым каталогом. ATOMIC_MOVE: Это означает, что перемещение выполняется как атомарная операция файловой системы, и все остальные параметры игнорируются. Этот метод генерирует исключение FileAleadyExistsException, если целевой файл существует, но его нельзя заменить, потому что опция REPLACE_EXISTING не указана. Этот метод генерирует исключение DirectoryNotEmptyException, если указана опция REPlACE_EXISTING, но файл нельзя заменить, потому что это непустой каталог.
  22. newBufferedReader(Path path, Charset cs): Этот метод открывает файл по указанному пути для чтения, возвращая BufferedReader, который используется для чтения текста из файла. Байты из файла декодируются в символы с использованием указанной кодировки.
  23. newBufferedWriter(Path path, Charset cs, Openoption… options): Этот метод открывает или создает файл с заданным путем для записи, возвращая BufferedWriter, который используется для записи текста в файл. Параметр options указывает, как файл создается или открывается. Если параметр не указан, то по умолчанию используются параметры CREATE, TRUNCATE_EXISTING и WRITE, что означает открытие файла для записи и создание файла, если его нет, или усечение существующего файла до размера 0, если он существует. Этот метод генерирует исключение UnsupportedOperationException, если указана неподдерживаемая опция.
  24. newByteChannel(Path path, OpenOption… options): Этот метод создает или открывает файл с указанным путем, возвращая канал байтов для доступа к файлу. Этот метод генерирует исключение UnsupportedOperationException, если указана неподдерживаемая опция.
  25. newDirectoryStream(Path path): Этот метод открывает каталог, возвращая DirectoryStream для итерации по всем записям в каталоге с указанным путем. Элементы, возвращаемые итератором DirectoryStream, имеют тип Path, и каждый из них представляет собой запись в каталоге. Этот метод генерирует исключение NotDirectoryException, если файл по указанному пути не может быть открыт, потому что он не является каталогом.
  26. newDirectoryStream(Path path, Filter<? super Path > filter): Этот метод открывает каталог, возвращая DirectoryStream для итерации по всем записям в каталоге из указанного пути. Элементы, возвращаемые итератором DirectoryStream, имеют тип Path, и каждый из них представляет собой запись в каталоге, и эти записи фильтруются указанным фильтром. Этот метод генерирует исключение NotDirectoryException, если файл по указанному пути не может быть открыт, потому что это не каталог.
  27. newDirectoryStream(Path path, String glob): Этот метод открывает каталог, возвращая DirectoryStream для итерации по всем записям в каталоге из указанного пути. Элементы, возвращаемые итератором DirectoryStream, имеют тип Path, и каждый из них представляет собой запись в каталоге, и эти записи фильтруются сопоставлением строкового представления их имен файлов с указанным шаблоном globbing. Этот метод генерирует исключение NotDirectoryException, если файл по указанному пути не может быть открыт, потому что это не каталог, и PatternSyntaxException, если шаблон недопустим.
  28. newInputStream(Path path, Openoption… options): Этот метод открывает файл, возвращая поток ввода для чтения файла из указанного пути. Параметр options определяет, как файл открывается, и если не указаны никакие опции, то файл открывается с помощью READ. Этот метод генерирует исключение IllegalArgumentException, если указана недопустимая комбинация опций, и UnsupportedOperationException, если указана не поддерживаемая опция.
  29. newOutputStream(Path path, Openoption… options): Этот метод открывает файл, возвращая поток вывода для записи байтов в файл по указанному пути. Параметр options определяет, как файл открывается. Если опция не указана, то по умолчанию принимаются опции CREATE, TRUNCATE_EXISTING и WRITE, что означает открытие файла для записи и создание файла, если он не существует, или обрезка существующего файла до размера 0, если он существует. Этот метод генерирует исключение IllegalArgumentException, если указано недопустимое сочетание опций, и UnsupportedOperationException, если указана неподдерживаемая опция.
  30. notExists(Path path, LinkOption options): Этот метод проверяет, не существует ли файла по указанному пути. Параметр options используется для указания того, как обрабатываются символические ссылки, если файл является символической ссылкой. По умолчанию символические ссылки следуются. Если присутствует опция NOFOLLOW_LINK, то символические ссылки не следуются. Этот метод возвращает true, если файл не существует по указанному пути, и false, если файл существует, или если его существование не может быть определено.
  31. readAllBytes(Path path): Этот метод считывает все байты из файла по указанному пути и возвращает массив байтов, содержащий считанные байты из файла.
  32. readAllLines(Path path, Charset cs): Этот метод считывает все строки из файла по указанному пути и возвращает List, содержащий строки из файла.
  33. size(Path path): Этот метод возвращает размер файла по указанному пути в байтах.
  34. walkFileTree(Path start, FileVisitor<? Super Path> visitor): Этот метод используется для обхода директории. Он рекурсивно обходит директорию по указанному пути и возвращает начальный файл.
  35. write(Path path, byte[] bytes, OpenOption… options): Этот метод записывает байты в файл по указанному пути. Параметр options указывает, как файл создается или открывается. Если опция не указана, то по умолчанию используются опции CREATE, TRUNCATE_EXISTING и WRITE, что означает, что файл открывается для записи и создается, если он не существует, или усекается существующий файл до размера 0, если он существует. Все байты в массиве байтов записываются в файл. Этот метод гарантирует, что файл закрывается, когда все байты были записаны, и возвращает путь записанного файла.

Создание файла с использованием класса Files

Класс Files предоставляет метод createFile(Path filePath, FileAttribute<?>… attrs) для создания файла с использованием указанного Path. Давайте рассмотрим пример программы ниже.

package com.journaldev.examples;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * Java Create file using Files class
 * 
 * @author pankaj
 *
 */
public class FilesCreateFileExample {

	public static void main(String[] args) {
		
		// инициализация объекта Path
		Path path = Paths.get("D:/data/file.txt");
		// создание файла
		try {
			Path createdFilePath = Files.createFile(path);
			System.out.println("File Created at Path : "+createdFilePath);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

Результат выполнения программы приведен ниже:

File Created at Path : D:\data\file.txt

Создание каталогов с использованием класса Files

Класс Files предоставляет методы createDirectory(Path dir, FileAttribute<?>… attrs) и createDirectories(Path dir, FileAttribute<?>… attrs) для создания одиночных и многоуровневых каталогов с использованием указанного Path. Давайте рассмотрим ниже приведенную программу-пример.

package com.journaldev.examples;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * Java Create directories using Files class
 * 
 * @author pankaj
 *
 */
public class FilesCreateDirectoriesExample {

	public static void main(String[] args) {
		// инициализация объектов Path
		Path path1 = Paths.get("D:/pankaj");
		Path path2 = Paths.get("D:/pankaj/java7");
		Path path3 = Paths.get("D:/pankaj/java7/Files");
		
		try {
			Path createdDir1 = Files.createDirectory(path1);//first level directory
			Path createdDir2 = Files.createDirectory(path2);//second level directory
			Path createdDir3 = Files.createDirectory(path3);//all level directories
			System.out.println("First Level Directory Created at Path : "+createdDir1);
			System.out.println("Second Level Directory Created at Path : "+createdDir2);
			System.out.println("All Level Directories Created at Path : "+createdDir3);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

Вывод вышеуказанной программы:

First Level Directory Created at Path : D:\pankaj
Second Level Directory Created at Path : D:\pankaj\java7
All Level Directories Created at Path : D:\pankaj\java7\Files

Преобразование файла в Path и наоборот

Объекты File и Path могут быть преобразованы друг в друга с использованием следующих методов:

File file = new File(“D:/data/file.txt”);

Path path = file.toPath();

File file1 = path.toFile();

Чтение данных из файла с использованием класса Files

Класс Files предоставляет следующие методы для чтения файла.

  1. readAllBytes(Path path): Этот метод читает все байты из файла по указанному пути и возвращает массив байтов, содержащий байты, прочитанные из файла.
  2. readAllLines(Path path, Charset cs): Этот метод читает все строки из файла по указанному пути и возвращает List, содержащий строки из файла.

Давайте посмотрим на пример программы ниже.

package com.journaldev.examples;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;

/**
 * Java Files read file example
 * 
 * @author pankaj
 *
 */
public class FilesReadFileExample {

	public static void main(String[] args) {
		
		Path path = Paths.get("D:/data/file.txt");
		try {
			byte[] bs = Files.readAllBytes(path);
			List<String> strings = Files.readAllLines(path);
			
			System.out.println("Read bytes: \n"+new String(bs));
			System.out.println("Read lines: \n"+strings);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

Вывод вышеуказанной программы представлен ниже:

Read bytes: 
Hello world
This is Read file example
Thank you
Read lines: 
[Hello world, This is Read file example, Thank you]

Копирование файла с использованием класса Files

Класс Files предоставляет метод copy(Path source, Path target, CopyOption… options), который копирует указанный исходный файл в указанный целевой файл и возвращает путь целевого файла. Давайте рассмотрим пример программы ниже:

package com.journaldev.examples;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

/**
 * Java Files copy file example
 * 
 * @author pankaj
 *
 */
public class FilesCopyFileExample {

	public static void main(String[] args) {
		Path sourcePath = Paths.get("D:/data/sourceFile.txt");
		Path targetPath = Paths.get("D:/data/targetFile.txt");
		
		try {
			Path path = Files.copy(sourcePath, targetPath,StandardCopyOption.REPLACE_EXISTING);//copy with REPLACE_EXISTING option
			System.out.println("Target file Path : "+path);
			System.out.println("Copied Content : \n"+new String(Files.readAllBytes(path)));
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

Вывод вышеуказанной программы представлен ниже:

Target file Path : D:\data\targetFile.txt
Copied Content : 
Hello world
This is Copy file example
Thank you

Перемещение файла с использованием класса Files

Класс Java Files предоставляет метод move(Path source, Path target, CopyOption… options), который перемещает или переименовывает исходный файл в целевой файл и возвращает путь к целевому файлу. Параметр Option может включать следующее: REPLACE_EXISTING: Это означает, что если целевой файл существует, то он заменяется, если это не пустой каталог. ATOMIC_MOVE: Это означает, что перемещение выполняется как атомарная операция файловой системы, и все остальные параметры игнорируются. Этот метод генерирует исключение FileAleadyExistsException, если целевой файл существует, но его нельзя заменить, потому что параметр REPLACE_EXISTING не указан. Этот метод генерирует исключение DirectoryNotEmptyException, если параметр REPLACE_EXISTING указан, но файл нельзя заменить, потому что это непустой каталог. Давайте рассмотрим пример программы ниже:

package com.journaldev.examples;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;

/**
 * Java Files move file example
 * 
 * @author pankaj
 *
 */
public class FilesMoveFileExample {

	public static void main(String[] args) {
		Path sourcePath = Paths.get("D:/data/sourceFile.txt");
		Path targetPath = Paths.get("D:/data/targetFile.txt");
		try {
			Path path = Files.move(sourcePath, targetPath,StandardCopyOption.REPLACE_EXISTING);//move with REPLACE_EXISTING option
			System.out.println("Target file Path : "+path);
			System.out.println("Moved Content : \n"+new String(Files.readAllBytes(path)));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

Запись файла с использованием класса Files

Класс Java NIO Files предоставляет метод write(Path path, byte[] bytes, OpenOption… options), который записывает байты в файл по указанному пути. Параметр options указывает, как файл создается или открывается. Если никакая опция не указана, то по умолчанию рассматриваются опции CREATE, TRUNCATE_EXISTING и WRITE. Это означает, что файл открывается для записи и создается, если он не существует, или обрезается до размера 0, если он существует. Все байты в массиве байтов записываются в файл. Этот метод гарантирует, что файл закрывается, когда все байты записаны, и возвращает путь записанного файла.

package com.journaldev.examples;

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 * Java Files write file example
 * 
 * @author pankaj
 *
 */
public class FilesWriteFileExample {

	public static void main(String[] args) {
		Path path = Paths.get("D:/data/test.txt");
		try {
			String str = "This is write file Example";
			byte[] bs = str.getBytes();
			Path writtenFilePath = Files.write(path, bs);
			System.out.println("Written content in file:\n"+ new String(Files.readAllBytes(writtenFilePath)));
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

Обход дерева файлов

Класс Files предоставляет метод walkFileTree(Path start, FileVisitor<? Super Path> visitor), который используется для обхода каталога. Он рекурсивно обходит каталог по указанному пути и возвращает начальный файл.

package com.journaldev.examples;

import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;

/**
 * Java Files walk file tree example
 * 
 * @author pankaj
 *
 */
public class FilesWalkFileTreeExample {

	public static void main(String[] args) {
		Path path = Paths.get("D:/pankaj");
		try {
			Files.walkFileTree(path, new FileVisitor<Path>() {

				@Override
				public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
					System.out.println("Post Visit Directory: "+dir);
					return FileVisitResult.CONTINUE;
				}

				@Override
				public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
					System.out.println("Pre Visit Directory: "+dir);
					return FileVisitResult.CONTINUE;
				}

				@Override
				public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
					System.out.println("Visit File: "+file);
					return FileVisitResult.CONTINUE;
				}

				@Override
				public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
					System.out.println("Visit Failed File: "+file);
					return FileVisitResult.CONTINUE;
				}
			});
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

Вывод вышеуказанной программы приведен ниже:

Pre Visit Directory: D:\pankaj
Pre Visit Directory: D:\pankaj\java6
Pre Visit Directory: D:\pankaj\java6\Files
Visit File: D:\pankaj\java6\Files\file.txt.txt
Post Visit Directory: D:\pankaj\java6\Files
Post Visit Directory: D:\pankaj\java6
Pre Visit Directory: D:\pankaj\java7
Pre Visit Directory: D:\pankaj\java7\Files
Visit File: D:\pankaj\java7\Files\file.txt.txt
Post Visit Directory: D:\pankaj\java7\Files
Post Visit Directory: D:\pankaj\java7
Pre Visit Directory: D:\pankaj\java8
Pre Visit Directory: D:\pankaj\java8\Files
Visit File: D:\pankaj\java8\Files\file.txt.txt
Post Visit Directory: D:\pankaj\java8\Files
Post Visit Directory: D:\pankaj\java8
Post Visit Directory: D:\pankaj

Обратите внимание, что все файлы и папки обрабатываются рекурсивно. Это очень полезно, когда вы хотите выполнить общую обработку всех файлов, например, переименовать все файлы в каталоге рекурсивно. Вот и все для класса Java Files. Ссылка: Документация API

Source:
https://www.digitalocean.com/community/tutorials/java-files-nio-files-class