Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

Библиотека примеров приложений Java

Оглавление
Выбор файлов
Простейший редактор текста
Копирование файлов UNICODE
Сохранение объекта Java в файле
Произвольные классы и файлы
Буферизация потоков
Разбор конфигура-
ционного файла

Работа с консолью
Работа с классом PrintWriter
Разбор строк класса String
Загрузка и просмотр изображений
Потоки в оперативной памяти
Конвейерные потоки
Комбинирование двух потоков
Комбинирование нескольких потоков
Поиск слова в текстовом файле
Произвольный доступ к файлу
Информация о файле
Работа с каталогами
Просмотр содержимого каталога
Просмотр каталога с фильтром
Панель для выбора каталога
Список системных свойств
Сохранение списка системных свойств
Контрольная сумма файла
Копирование, переименование, удаление файлов
Архивы ZIP
Создание архива ZIP
Распаковка архива ZIP
Обход дерева каталогов

Назад Вперед

7.26. Копирование, переименование и удаление файлов

В примере демонстрируются способы создания, копирования, переименования и удаления файлов с применением классов File, FileOutputStream, FileInputStream, OutputStream, InputStream.

Исходный текст примера

Архив проекта для Java WorkShop 2.0

Немного теории

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

Если указанный вами файл уже существует, то при использовании данной технологии он будет перезаписан. Вы, однако, можете этого избежать, если предварительно проверите существование файла методом exists, определенным в классе File.

Чтобы переименовать файл, вам нужно создать два объекта класса File - один для исходного, другой для результирующего файла. Далее воспользуйтесь методом renameTo, определенным в классе File.

Заметим, что если переименование завершилось успешно, метод renameTo возвращает значение true, а если нет - false.

Удалить существующий файл можно методом delete, определенным в классе File. Этот метод, как и метод renameTo возвращает значение true при успешном завершении операции и false - при возникновении ошибок.

Что же касается копирования файлов, то стандартных методов, предназначенных для выполнения этой операции, не существует. Вы можете скопировать файл, читая его, например, по блокам методом read и записывая прочитанные данные в выходной файл методом write.

Описание примера

Наш пример является автономным приложением Java. Он выполняет несколько операций над файлом, созданным в текущем каталоге.

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

* File control demonstration

Absolute path: E:\test\!temp.txt
Canonical path: E:\test\!temp.txt
Length: 40
Done!

Рассмотрим исходный текст приложения.

Так как операции над файлами могут вызывать исключения, они выполняются в блоке try-catch:

try
{  
  . . .
}
catch(Exception ex)
{
  System.out.println(ex.toString());
}

Прежде всего наше приложение создает объект класса File для файла с именем !temp.txt:

File f = new File("!temp.txt");

Далее выполняется создание объекта класса FileOutputStream, что, собственно, и приводит к созданию файла !temp.txt в текущем каталоге:

FileOutputStream fos = 
  new FileOutputStream(f);

Для записи в файл текстовых строк класса String мы создаем на базе потока fos класса FileOutputStream выходной форматированный поток данных dos класса DataOutputStream:

DataOutputStream dos = 
  new DataOutputStream(fos);

Запись строк в выходной поток dos выполняется в цикле:

int i;
for(i = 0; i < 10; i++)
  dos.writeBytes("Test");

Далее мы закрываем выходной поток методом close:

dos.close();

Теперь файл !temp.txt создан и в нем есть данные. Наша программа определяет и выводит на консоль абсолютный и канонический путь к файлу, а также длину файла:

System.out.println("Absolute path: " +
  f.getAbsolutePath());

System.out.println("Canonical path: " +
  f.getCanonicalPath());
        
System.out.println("Length: " +
  f.length());

Вся эта информация получается с помощью соответствующих методов класса File.

На втором этапе выполняется переименование файла !temp.txt:

File f1 = new File("!temp1.txt");
      
if(!f.renameTo(f1))
  System.out.println("Rename failed");

Новое имя будет !temp1.txt.

Если в процессе переименования произошла ошибка, мы выводим на консоль соответствующее сообщение.

Третий этап работы нашего приложения - копирование переименованного файла !temp1.txt в файл output.txt. Эта процедура заключается в создании входного и выходного потоков с последующем вызовом статического метода fileCopy, определенного в нашем приложении:

FileInputStream fis = 
  new FileInputStream("!temp1.txt");
        
FileOutputStream fos1 = 
  new FileOutputStream("output.txt");
        
fileCopy(fis, fos1);

Удаление исходного файла temp1.txt выполняется методом delete:

if(!f1.delete())
  System.out.println("Delete failed");

Что же касается метода fileCopy, предназначенного для копирования файлов, то его исходный текст достаточно прост:

public static void fileCopy(InputStream is, 
  OutputStream os) throws IOException
{
  int nLength;
  byte[] buf = new byte[8000];
  while(true)
  {
    nLength = is.read(buf);
      if(nLength < 0) 
        break;
    os.write(buf, 0, nLength);
  }
       
  is.close();
  os.close();
}

Обратите внимание на то что мы не стали выполнять обработку исключений внутри метода, воспользовавшись вместо этого ключевым словом throws с параметром IOException в заголовке метода. В результате метод, вызвавший fileCopy, может выполнять свою собственную обработку исключений, уместную в контексте программы.

Для копирования мы использовали промежуточный буфер buf размером 8000 байт.

Блоки данных из входного потока is читаются в этот буфер методом read, а затем записываются в выходной поток методом write. Все это выполняется в цикле до тех пор пока не будет достигнут конец входного потока. В этом случае метод read вернет значение, равное -1.

После завершения цикла копирования метод fileCopy закрывает входной и выходной поток.


Назад Вперед

[Назад]