Класс RandomAccessFile. Класс File. Практическая работа
Класс RandomAccessFile Буквально: файл прямого доступа. Данный класс обеспечивает как операции чтения файла, так и операции записи в файл. Т. е. он объединяет возможности, заложенные в иерархиях Reader и Writer. Кроме того, он имеет методы, позволяющие выполнять позиционирование на заданный байт файла. Рассмотрим конструкторы класса RandomAccessFile : public RandomAccessFile(File file, String mode) throws FileNotFoundException public RandomAccessFile(String name, String mode) throws FileNotFoundException Они отличаются от аналогичных конструкторов классов FileReader и FileWriter наличием параметра mode. Этот параметр может быть равен либо " r" (только чтение), либо " rw" (чтение и запись). Класс RandomAccessFile имеет большое количество методов как для чтения, так и для записи данных. В частности, он имеет те же методы чтения, что и в InputStream или Reader. Кроме того, в нем есть метод readLine, аналогичный одноименному методу из BufferedReader, а также методы из DataInputStream: по одному методу вида readXXX для каждого базового типа, например, public final float readFloat() throws IOException Этот метод позволяет считать число с плавающей точкой. Методы записи такие же, как OutputStream или Writer, плюс методы из DataOutputStream. К сожалению эксперименты с методам readLine и методами из DataInputStream и DataOutputStream приводят к выводу о наличии проблем при их практическом использовании. Метод readLine имеет проблемы с национальными кодировками, а методы из DataInputStream и DataOutputStream работают с кодировкой Unicode. Кроме этих методов RandomAccessFile имеет ряд методов для обеспечения произвольного доступа. Это самая важная часть функциональности, которую обеспечивает класс RandomAccessFile. public long getFilePointer() throws IOException Возвращает текущую позицию в файле. public long length() throws IOException Возвращает длину файла. public void seek(long pos) throws IOException
Устанавливает новую текущую позицию в файле. public void setLength(long newLength) throws IOException Устанавливает новую длину файла. При этом происходит либо усечение, либо расширение файла. public int skipBytes(int n) throws IOException Пропускает n байт файла. Возвращает реально пропущенное число байт (оно будет меньше n, если файл недостаточно длинный для пропуска n байт). Класс File Это очень важный класс. Без него нельзя было бы удалить существующий файл, создать каталог (папку), узнать какие файлы есть в данном каталоге. Класс File имеет следующие конструкторы: public File(String pathname) public File(String parent, String child) public File(File parent, String child)
Рассмотрим наиболее важные методы данного класса. public boolean exists() Проверяет, существует ли данный файл. public boolean canRead() Проверяет, можно ли читать данный файл. Современные ОС позволяют устанавливать различные полномочия доступа к файлу для разных пользователей. В частности, можно запретить чтение файла тем или иным пользователям. Данный метод возвращает false также в том случае, если файл не существует. public boolean canWrite() Проверяет, можно ли писать в файл. public boolean isDirectory() Является ли данный файл каталогом (папкой). public boolean isFile() Является ли данный файл обычным файлом (не каталогом). public boolean delete() Удаляет файл, если он существует. Файл может быть и каталогом. Тогда он удаляется только в том случае, если он пуст. public File[] listFiles() Возвращает массив файлов в каталоге (массив объектов класса File). public boolean mkdir() Создает пустой каталог. Есть еще целый ряд полезных методов в данном классе (см. документацию). Практическая работа 1. Рассмотрим программу для удаления всех файлов в указанном каталоге (каталог задается параметром вызова программы).
// DirClean. java: удаление всех файлов в указанном каталоге import java. io. *; public class DirClean { public static void main(String args[]) { //--- 1. Проверим параметры вызова программы if ( args. length == 0 ) { System. out. println(" Формат вызова: java DirClean имя_каталога" ); return; } //--- 2. Создадим объект File для данного каталога и проверим, что // — он существует; // — что это действительно каталог. File dir = new File(args[0]); if (! dir. isDirectory() ) { System. out. println(" Каталог " +args[0]+" не существует или" + " не является каталогом" ); return; } //--- 3. Получим массив всех файлов в данном подкаталоге File[] fList = dir. listFiles(); int ftotal = fList. length; if ( ftotal == 0 ) { // нечего удалять System. out. println(" Каталог " +args[0]+" уже пуст" ); return; } //--- 4. Запрос к пользователю на подтверждение операции удаления System. out. println(" Подтвердите удаление " +ftotal+ " файлов в каталоге " +args[0]+" Y/N" ); try { byte r[] = new byte[1]; r[0] = (byte)System. in. read(); char resp = (new String(r)). charAt(0); if ( resp == 'y' || resp == 'Y' ) { for ( int i = 0; i < ftotal; i++ ) fList[i]. delete(); System. out. println(" Удалено " + ftotal + " файлов" ); } } catch (IOException ex) { ex. printStackTrace(); } }} В данной программе используются следующие методы класса File: isDirectory, listFiles, delete. Нужно разобраться в этой программе и написать ее вариант, который удаляет только те файлы, которые доступны и на чтение и на запись. 2. (Самостоятельная работа). Изменим программу WordConverter. java так, чтобы она в результате своей работы порождала бы не новый файл res. txt, а модифицировала существующий. При этом исходный файл она должна сохранить с расширением bak. Изучим проблему. Во-первых, мы не можем сразу писать в тот же файл, из которого мы читаем. Поэтому для вывода нам понадобиться какой-то файл. После окончания обработки исходного файла мы должны его переименовать в файл с расширением bak (нужно не забыть закрыть его перед переименованием). Когда мы переименуем исходный файл, мы можем переименовать выходной файл. Таким образом, нам потребуется. a. Возможность создания временного файла.
b. Возможность переименования файлов. Все это есть в классе File. Во-первых, есть два метода createTempFile. Лучше использовать второй из них. public static File createTempFile(String prefix, String suffix, File directory) throws IOException Иначе могут возникнуть проблемы с переименованием файла, если временный файл будет создан физически не на том же диске, что и исходный. Но в этом случае нам нужно иметь параметр directory — каталог, в котором находится исходный файл. Для получения каталога можно использовать метод public File getParentFile() Возможность переименования файлов тоже имеется в классе File — это метод public boolean renameTo(File dest) Теперь осталось только все это собрать воедино и получить работающую программу.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|