Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
кпп.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
238 Кб
Скачать
☆

Новая библиотека ввода/вывода.

Преимущества библиотеки nio.  Нет булевских флагов, вместо них методы бросают исключения. Более широкий набор возможностей. Методы позволяют работать с расширенными атрибутами файлов, например с правами доступа, или с владельцем файла.

Появилась возможность работы с символическими ссылками, в частности создавать их или узнавать, куда символическая ссылка ведет. И, кроме того, появились корректные, платформенно – независимые методы переименования или перемещения. 

В новом API аналогом прежнего класса File является класс java.nio.file.Path.

Аналоги функций, ранее присутствовавших в классе File:

 import  java.nio.File;

import  java.nio.file.Path;

…

Path  path  =  Paths.get(“home/src/java”);

File  fromPath  =  path.toFile();

Path  fromFile  =  fromPath.toPath();

 Новые методы:

Path  my_path  =  Paths.get(“/usr/bin/java”);

my_path.isAbsolute();                       // true

my_path.getFileName();                    // java

my_path.getParent();                         // "/usr/bin"    

 

my_path.getNameCount();                // 3

my_path.getName(1);                                    // bin   - получение компонента пути по его индексу

my_path.resolveSibling(“javap”);      // "/usr/bin/javap"

my_path.startsWith(“/usr”);               // true  - является ли один путь префиксом другого

Path.get("/usr").relativize(my_path);  // "bin/java" – вычисление относительного пути

 

Для работы с файлами в новом классе так же есть как аналоги прежних функций, так и новые удобные методы:

 Path  java  =  Path.get("/usr/bin/java");

Files.exists(java);

Files.isRegularFile(java);

Files.size(java);

Files.getLastModifiedTime(java).toMillis();  // время посл. Модификации в ms.

 

Files.copy(java, Path.get("/usr/bin/java_copy"), StandardCopyOption.REPLACE_EXISTING);

Files.move( …);

 Методы копирования и перемещения позволяют задавать дополнительные опции и не имеют ограничений, связанных с типом платформы.

 В новом API cерьезно изменен метод получения содержимого директории:

 Path  user_bin  =  Path.get("/usr/bin");

Files.exists(user_bin);                                    // true

Files.isDirectory(user_bin);                           // true 

try  (DirectoryStream<Path>  dirStream  = 

Files.newDirectoryStream(user_bin))  {

            for(Path  child :  dirStream) {

                        System.out.println(child);

            }

}

 Содержимое директории получают с помощью статического объекта DirectoryStream, в который можно дополнительно передать фильтр (user_bin). Объект DirectoryStream связан с потреблением ресурсов системы, поэтому по завершении работы с ним его ресурс нужно освобождать, для чего служит заключение его в блок try {…}

Объект позволяет обрабатывать содержимое больших директорий в потоковом режиме небольшими порциями.

 Для создания директорий используется пара аналогичных методов с тем же смыслом, что и в методах класса File:

 Path  dir  =  Path.get("/a/b/c");

 Files.createDirectory(dir);

Files.createDirectories(dir);

 В новом API появилась возможность поддержки виртуальных файловых систем в том смысле, что можно открыть какой-либо zip – архив и работать с ним совершенно прозрачно, как с обычной директорией с файлами. Так же точно можно реализовать работу с файлами любого другого архиватора, или даже с файловой системой удаленного компьютера.