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

Функции стандартной библиотеки ввода/вывода.

Функции и классы, обслуживающие задачи доступа к файловой системе сгруппированы в классе File из пакета java.io, вместе с другими классами, отвечающими за ввод/вывод.

Пример создания экземпляра File:

 import  java.io.File;

File  jfile  =  new File(“C:\\jdk1.8.0\\bin\\java.exe”);

 Удвоенные обратные слеши здесь соответствуют экранированным одинарным слешам Windows. В Linux – подобных системах слеши будут прямые.

Чтобы избежать употребления двойных слешей можно воспользоваться константами File.separator или File.separator.Char, которые определяют вид разделителя пути в конкретной ОС.

 String  my_dir_name  =  “src”;

String  my_file_name  =  “Main.java”;

String  my_file_path  =  my_dir_name + File.separator + my_file_name;

 Если файл находится в текущей директории, методы класса File позволяют вычислить абсолютный и относительный пути к нему. 

File  ma_file  =  new  File(“readme.txt”);

relativeFile.isAbsolute();              // вернет false, поскольку путь не является абсолютным

relativeFile.getAbsolutePath();    // вернет строку «/home/src/java/readme.txt» - абс. путь.

 С помощью методов класса File можно разобрать строку с путем на составляющие.

 File file  =  new File(“/home/src/java/readme.txt”);

 String  path  =  file.getPath();   // «/home/src/java»

String  name_file  =  file.getName();   //  readme.txt

String  parent_directory  =  file.getParent();  // «/home/src» - родительская директория

 Если нам нужно сравнить абсолютные пути к файлам, заданным относительными путями (вроде  «../», «.», «//» и т.п.), чтобы убедиться, что обе ссылки ведут к одному и тому же файлу, можно воспользоваться методом, вычисляющим канонический путь. Пример:

 File  my_file  =  new  File(“./../readme.txt”);

String canonicalPath  =  file.getCanonicalPath();  //  вернет  «/home/src/java/readme.txt»

Приведя оба пути к каноническому виду, их можно сравнивать как строки.

После того, как мы получили доступ к файлу через объект File, модно запросить у него какие-нибудь дополнительные данные по файлу. Пример:

 File  my_file  =  new  File(“/home/src/java/readme.txt”);

my_file.exists();          // существует ли файл «true/false»

my_file.isFile();          // это файл или директория «true»

my_file.isDirectory();  // «false»

my_file.length();         ..// 12345

my_file.lastModified();  // время последней модификации

 Если вместо файла объект содержит директорию, то можно получить её содержимое:

 File  my_dir  =  new  File(“/home/src/java”);

my_dir.exists();          // true

my_dir.isFile();           // false

my_dir.isDirectory();  // true

 my_dir.list();               // String []

my_dir.listFiles();       // File []

 Содержимое возвращается только на один уровень. Если есть поддиректории, то прийдется вручную написать функцию рекурсивного обхода поддиректорий.

 Все рассмотренные методы фактически работают с содержимым экземпляра File и ничего не меняют в файловой системе на диске, поэтому они не возбуждают исключений.

 Если же реально попытаться записать какой-нибудь файл, то блок вызова этой функции нужно обязательно обернуть в блок try  -  catch  (исключения будут рассмотрены в следующей лекции).

 try {

            Boolean  success  =  file.createNewFile();                // true/false

} catch  (IOExсeption e)  {

            // handle error

}

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

Для создания директорий используются функции:

 File dir  =  new File(“a/b/c”);

boolean  result  =  dir.mkdir();           // может создать только одну директорию за раз.

boolean  result  =  dir.mkdirs();         // может создать все поддиректории за один вызов.

 Переименование/перемещение.

 boolean result  =  file.renameTo(targetFile);

 Теоретически можно с помощью этого метода переместить файл в другую директорию, но на практике эта функция является платформенно-зависимой и результат перемещения малопредсказуем. Поэтому лучше использовать только для переименования, а перемещать путем копирования содержимого файла в новый файл другими функциями.

 Основной недостаток функций из стандартной библиотеки в том, что большинство из них вместо выбрасывания исключения возвращают простое булевское true/false и поэтому в случае ошибки программисту неоткуда взять информацию о причине сбоя.

Эти недостатки исправлены в новой библиотеке версии java 7, классы которой для работы с файлами и директориями располагаются в пакете java.nio.file