1. Filesклас

Клас файлове

За работа с файлове има елегантен помощен клас — java.nio.file.Files. Има методи за всеки повод. Всички методи от този клас са статични и работят с обект Path. Има много методи, така че ще разгледаме само най-важните:

Метод Описание
Path createFile(Path path)
Създава нов файл, чийто път еpath
Path createDirectory(Path path)
Създава нова директория
Path createDirectories(Path path)
Създава множество директории
Path createTempFile(prefix, suffix)
Създава временен файл
Path createTempDirectory(prefix)
Създава временна директория
void delete(Path path)
Изтрива файл or директория, ако е празен
Path copy(Path src, Path dest)
Копира файл
Path move(Path src, Path dest)
Премества файл
boolean isDirectory(Path path)
Проверява дали пътят е директория, а не файл
boolean isRegularFile(Path path)
Проверява дали пътят е файл, а не директория
boolean exists(Path path)
Проверява дали обектът съществува на дадения път
long size(Path path)
Връща размера на file
byte[] readAllBytes(Path path)
Връща цялото съдържание на файл като масив от byteове
String readString(Path path)
Връща цялото съдържание на файл като низ
List<String> readAllLines(Path path)
Връща цялото съдържание на файл като списък от низове
Path write(Path path, byte[])
Записва масив от byteове във файл
Path writeString(Path path, String str)
Записва низ във файл
DirectoryStream<Path> newDirectoryStream(Path dir)
Връща колекция от файлове (и поддиректории) от дадената директория

2. Създаване на файлове и директории

Файлове и директории се създават много лесно. Нека се убедим с няколко примера:

Код Забележка
Files.createFile(Path.of("c:\\readme.txt"));
Създава файл
Files.createDirectory(Path.of("c:\\test"));
Създава директория
Files.createDirectories(Path.of("c:\\test\\1\\2\\3"));
Създава директория и всички необходими поддиректории, ако не съществуват.

3. Копиране, преместване и изтриване

Копирането, преместването и изтриването на файлове е също толкова лесно. Това важи и за директориите, но те трябва да са празни.

Код Забележка
Path path1 = Path.of("c:\\readme.txt");
Path path2 = Path.of("c:\\readme-copy.txt");
Files.copy(path1, path2);
Копира файл
Path path1 = Path.of("c:\\readme.txt");
Path path2 = Path.of("d:\\readme-new.txt");
Files.move(path1, path2);
Премества и преименува файл
Path path = Path.of("d:\\readme-new.txt");
Files.delete(path);
Изтрива файл

4. Проверка на вида и съществуването на файл

Когато имате път, предоставен от някой друг, искате да знаете дали това е файл or директория. И въобще такъв файл/директория съществува or не?

За това също има специални методи. Можете също така лесно да разберете дължината на даден файл:

Код Забележка
Files.isRegularFile(Path.of("c:\\readme.txt"));
true
Files.isDirectory(Path.of("c:\\test"));
true
Files.exists(Path.of("c:\\test\\1\\2\\3"));
false
Files.size(Path.of("c:\\readme.txt"));
10112

5. Работа със съдържанието на file

И накрая, има цяла серия от методи, които улесняват четенето or записването на съдържанието на файл. Пример:

Код Описание
Path path = Path.of("c:\\readme.txt");
List<String> list = Files.readAllLines(path);

for (String str : list)
   System.out.println(str);

Прочетете съдържанието на file като списък от низове.

Покажете низовете


6. Получаване на съдържанието на директория

Най-интересният метод все още остава. Използва се за получаване на файлове и поддиректории в дадена директория.

Говорим за newDirectoryStream()метода, който връща специален DirectoryStream<Path>обект. Има итератор(!), който можете да използвате, за да получите всички файлове и поддиректории на дадена директория.

Това е по-лесно, отколкото звучи.

Код Описание
Path path = Path.of("c:\\windows");

try (DirectoryStream<Path> files = Files.newDirectoryStream(path)) {
   for (Path path : files)
      System.out.println(path);
}


Вземете обект със списък от файлове
Превъртете списъка с файлове

Обектът DirectoryStream<Path>има два свойства. Първо, той има итератор, който връща пътищата на файловете и можем да използваме този обект в for-eachцикъл.

И второ, този обект е поток от данни, така че трябва да бъде изрично затворен с помощта на close()метода or декларирана употреба вътре в try-with-resourcesблок.



7. Files.newInputStreamметод

Започвайки с Java 5, класовете FileInputStreamи FileOutputStreamса отхвърлени. Един от техните недостатъци беше, че когато се създават обекти от тези класове, файловете се създават веднага на диска. И всички изключения, свързани със създаването на файл, потенциално могат да бъдат хвърлени.

По-късно това беше признато за не най-доброто решение. Съответно се препоръчва използването на методите на java.nio.Filesпомощния клас за създаване на файлови обекти.

Ето сравнение между стария и новия подход за създаване на файлове:

Преди
String src = "c:\\projects\\log.txt";
InputStream input = new FileInputStream(src);
След
String src = "c:\\projects\\log.txt";
InputStream input = Files.newInputStream( Path.of(src) );

И има подобна замяна за FileOutputStream:

Преди
String src = "c:\\projects\\log.txt";
OutputStream  output = new FileOutputStream( src );
След
String src = "c:\\projects\\log.txt";
OutputStream  output = Files.newOutputStream( Path.of( src ) );