- Андроид java архивирование файлов
- Архивирование директорий, zip
- Архивирование директории
- Разархивирование директории
- Zip архив в java — компрессия и извлечение файлов
- Создание архива
- Извлечение файлов из архива
- Zip-архивирование в Java
- Считывание содержимого Zip-архива.
- Запись в Zip-архив.
- Сжатие объектов с сохранением
- Андроид java архивирование файлов
- ZipOutputStream. Запись архивов
- Чтение архивов. ZipInputStream
Андроид java архивирование файлов
Полный текст статьи и исходники программы доступны только зарегистрированным участникам сайта.
Прочитайте внимательно условия! В начале каждой статьи указывается, к какому курсу относится данная статья. Например, если статья из 4 курса, значит нужно заплатить за все курсы по четвёртый включительно.
Стоимость регистрации — символические 350 рублей. После регистрации у вас будет доступ ко второму курсу.
Для регистрации сначала необходимо пополнить ЮMoney(бывший Яндекс.Кошелек) 410011383280263 на указанную сумму (или Webmoney-кошелек P894989790291 (старый R390884954122) или QIWI (перевод по никнейму), а затем прислать письмо на адрес alexander.klimoff@gmail.com с указанием, на какой кошелёк вы делали оплату и реквизиты, по которым можно вас определить (не прикрепляйте к письму картинки или файлы). Учитывайте комиссию при переводах.
Не присылайте в письме мои номера кошельков — поверьте, я их знаю и без вас.
В ответном письме вы получите учётные данные для чтения статей из закрытой зоны за второй курс.
Доступ к третьему курсу обучения доступен только после оплаты второго курса и составляет 350 руб.
Доступ к четвёртому курсу обучения доступен после оплаты третьего курса и составляет 350 руб. и т.д.
При оплате сразу всех курсов одновременно (2-9) цена составит 2800 руб.
Доступ даётся как минимум на один год. Для тех, кто оплатил третий и другие курсы, сроки доступа увеличиваются.
Также возможен приём на PayPal (только для зарубежных пользователей). Обратите внимание, что в этом случае стоимость одного курса составляет 7$.
Источник
Архивирование директорий, zip
Java для работы с файлами кроме общего функционала (чтение, запись и т.д.) предоставляет возможность использования zip-архивов. Для этого в пакете java.util.zip определены два класса — ZipInputStream и ZipOutputStream.
При работе с архивами еще в 1999 г. был зарегистрирован баг №4244499, связанный с наименованием файлов, использующие не латинские символы. То есть, наименования файлов с кирилицей искажались. И только в версии JDK 7 этот баг был исправлен — в ZIP API добавили новый конструктор, в котором можно явно указывать кодировку: ZipOutputStream (OutputStream out, Charset charset) К тому же, по-умолчанию используется стандартная UTF-8 кодировка. Таким образом, дополнительных библиотек использовать не нужно, можно сразу делать zip-архив.
К сожалению, мне не удалось создать нормальный архив с русскоязычными символами в наименованиях файлов и директорий. Поэтому в примерах я использовал библиотеку apache-ant-zip.jar, которая успешно решает вопросы архивации файлов, в названии которых используется кириллица.
В качестве примера будем использовать трехуровневую директорию следующей структуры :
Архивирование директории
Для правильной кодировки наименований русскоязычных файлов в примере используется метод setEncoding класса ZipOutputStream.
В примере используется рекурсивный метод addDirectory. В этом мтоде после добавления объекта ZipEntry в поток ZipOutputStream записывается содержимое файла. Для этого используется метод write, записывающий в поток массив байтов zout.write(buffer). В завершении ZipEntry закрывается с помощью метода closeEntry().
Результат работы программы можно увидеть в консоли :
Разархивирование директории
В примере разархивирования используется файл, созданный в предыдущем примере архивирования директории.
Метод Unzip в качестве входного параметра принимает архивный файл. ZipFile позволяет получить все «вхождения» директорий и файлов в архив. После этого в цикле извлекается содержимое архива.
Результат работы программы можно увидеть в консоли :
Источник
Zip архив в java — компрессия и извлечение файлов
Думаю, многие встречались с необходимостью создавать zip-архивы в java программах. Распаковка архивов из программного кода встречается куда реже, но все же встречается.
Давайте рассмотрим API для работы с архивами. Необходимые нам классы находятся в пакете java.util.zip.
Создание архива
Чтобы создать новый архив необходимо воспользоваться классом ZipOutputStream. Вот список методов, которые могут понадобиться:
- setLevel — установка уровня компрессии от 0 до 9, где 9 — максимальная компрессия;
- putNextEntry — вызывается перед записью нового объекта в архив, с указанием имени объекта;
- closeEntry — вызываем после записи объекта. putNextEntry автоматически вызывает метод closeEntry.
- close — закрываем поток.
Небольшой пример — создадим архив с названием archive.zip, в котором будут находиться сжатые файлы из директории folder. В этом примере пустые директории будут игнорироваться. Уровень компрессии явно не задан, поєтому будет использоваться значение по-умолчанию.
Обратите внимание, что при создании ZipEntry мы использовали относительный путь, а не просто имя файла. Это сделано для того, чтобы при архивации сохранились все дерево директорий, ведущих к файлу. В случае использования f.getName() в архиве просто будет плоский список файлов без информации о директориях.
Извлечение файлов из архива
Давайте теперь напишем небольшую утилиту на Java для извлечения фалов из zip-архива. Необходимые нам классы из пакета java.util.zip — это ZipFile и ZipEntry.
Для начала проверим, что на вход программы пользователь подал путь к архиву. Далее убедимся, что файл архива существует и может быть прочитан. Если все нормально, переходим непосредственно к процессу разархивации.
ZipFile как понятно из названия класса представляет собой файл архива. Одним из самых важных методов класса есть метод entries(). Метод возвращает перечисление объектов архива.
Итерируя по перечислению мы создаем необходимые пустые директории, если такие имеются, а так же пишем объекты на файловую систему, опять же с сохранением всех директорий.
У объекта ZipEntry кроме getName есть еще такие употребимые методы:
- getSize — размер файла в несжатом виде;
- getCompressedSize — размер, занимаемый файлом в архиве;
- getTime — время последней модификации объекта.
Ну а вот и исходник утилиты:
write() — вспомогательный метод, который пишет из одного потока в другой. Кстати, новичкам стоит запомнить, как из InputStream переписать информацию в OutputStream — такой вопрос периодически задают джуниорам на собеседовании.
Если еще остались вопросы — задавайте их в комментариях, постараюсь помочь.
Источник
Zip-архивирование в Java
категория Java | |
дата | 05.08.2010 |
автор | wisd |
голосов | 9 |
Считывание содержимого Zip-архива.
В Java для чтения Zip-архивов применяется класс ZipInputStream. В каждом таком архиве всегда требуется просматривать отдельные записи (entries). Метод getNextEntry возвращает описывающий запись объект типа ZipEntry. Метод read класса ZipInputStream изменяется так, чтобы он возвращал -1 в конце текущей записи (а не просто в конце Zip-файла). Далее вызывается метод closeEntry для получения возможности перехода к считыванию следующей записи.
ZipInputStream zin = new ZipInputStream(new FileInputStream(zipName));
ZipEntry entry;
while ((entry = zin.getNextEntry()) != null) <
//анализ entry
//считывание содежимого
zin.closeEntry();
>
zin.close();
Для считывания содержимого конкретной записи из Zip-файла эффективнее использовать не стандартный метод read, а методы какого-то обладающего большими возможностями потокового фильтра. Например, для считывания текстового файла, находящегося внутри Zip-архива, можно применить следующий цикл:
Scanner in = new Scanner(zin);
while (in.hasNextLine()) <
//выполнение операций с in.nextLine()
Запись в Zip-архив.
Для записи Zip-файла применяется класс ZipOutputStream. Для каждой записи, которую требуется поместить в Zip-файл, создается объект ZipEntry. Желаемое имя для файла передается конструктору ZipEntry; тот устанавливает устанавливает остальные параметры, вроде даты создания файла и метода распаковки. При желании эти параметры могут переопределяться. Далее вызывается метод putNextEntry класса ZipOutputStream для начала процесса записи нового файла. После этого данные самого файла отправляются потоку ZIp. По завершении вызывается метод closeEntry. Затем все эти действия выполняются повторно для всех остальных файлов, которые требуется сохранить в Zip-архиве. Ниже приведена общая схема необходимого кода:
FileOutputStream fout = new FileOutputStream(«test.zip»);
ZipOutputStream zout = new ZipoutputStream(fout);
//Для всех файлов:
<
ZipEntry ze = new ZupEntry(«имя файла»);//Имя файла — имя файла в архиве
zout.putNextEntry(ze);
//отправка данных в поток zout
zout.closeEntry();
>
zout.close();
Сжатие объектов с сохранением
Имеется класс «Работник» реализующий интерфейс для сериализации:
public class Employee implements Serializable <
String name;
int age;
int salary;
public Employee(String name, int age, int salary) <
this.name = name;
this.age = age;
this.salary = salary;
>
public void print() <
System.out.println(«Record for: » + name);
System.out.println(«Name: » + name);
System.out.println(«Age: » + age);
System.out.println(«Salary: » + salary);
>
>
Сохранить объекты данного класса мы можем следующим кодом:
import java.io.*;
import java.util.zip.*;
public class SaveEmployee <
public static void main(String argv[]) throws
Exception <
Employee sarah = new Employee(«S. Jordan», 28,
56000);
Employee sam = new Employee(«S. McDonald», 29,
58000);
FileOutputStream fos = new FileOutputStream(«db»);
GZIPOutputStream gz = new GZIPOutputStream(fos);
ObjectOutputStream oos = new ObjectOutputStream(gz);
oos.writeObject(sarah);
oos.writeObject(sam);
oos.flush();
oos.close();
fos.close();
>
>
Здесь всё просто, данные мы сохраняем в файл (FileOutputStream) перед этим сжав их (GZIPOutputStream), а в роли данных выступают объекты (ObjectOutputStream).
Загрузить сохраненные сжатые объекты также просто как и сохранить их:
import java.io.*;
import java.util.zip.*;
public class ReadEmployee <
public static void main(String argv[]) throws
Exception <
FileInputStream fis = new FileInputStream(«db»);
GZIPInputStream gs = new GZIPInputStream(fis);
ObjectInputStream ois = new ObjectInputStream(gs);
Employee sarah = (Employee) ois.readObject();
Employee sam = (Employee) ois.readObject();
sarah.print();
sam.print();
ois.close();
fis.close();
>
>
Данные считываются из файла (FileInputStream), файлы являются сжатыми (GZIPInputStream), данными являются объекты (ObjectInputStream).
Также можно обмениваться сжатыми объектами между сервером/клиентом (с использованием сокетов), ниже представлен код отправки сжатого объекта клиенту:
GZIPOutputStream gzipout =
new GZIPOutputStream(socket.getOutputStream());
ObjectOutputStream oos =
new ObjectOutputStream(gzipout);
oos.writeObject(obj);
gzipos.finish();
Ниже представлен код по получению и декомпрессии данных объекта от сервера:
Socket socket = new Socket(remoteServerIP, PORT);
GZIPInputStream gzipin =
new GZIPInputStream(socket.getInputStream());
ObjectInputStream ois = new ObjectInputStream(gzipin);
Object o = ois.readObject();
Если Вам понравилась статья, проголосуйте за нее
Голосов: 9 Голосовать
Источник
Андроид java архивирование файлов
Кроме общего функционала для работы с файлами Java предоставляет функциональность для работы с таким видом файлов как zip-архивы. Для этого в пакете java.util.zip определены два класса — ZipInputStream и ZipOutputStream
ZipOutputStream. Запись архивов
Для создания архива используется класс ZipOutputStream. Для создания объекта ZipOutputStream в его конструктор передается поток вывода:
Для записи файлов в архив для каждого файла создается объект ZipEntry , в конструктор которого передается имя архивируемого файла. А чтобы добавить каждый объект ZipEntry в архив, применяется метод putNextEntry() .
После добавления объекта ZipEntry в поток нам также надо добавить в него и содержимое файла. Для этого используется метод write, записывающий в поток массив байтов: zout.write(buffer); . В конце надо закрыть ZipEntry с помощью метода closeEntry() . После этого можно добавлять в архив новые файлы — в этом случае все вышеописанные действия для каждого нового файла повторяются.
Чтение архивов. ZipInputStream
Для чтения архивов применяется класс ZipInputStream . В конструкторе он принимает поток, указывающий на zip-архив:
Для считывания файлов из архива ZipInputStream использует метод getNextEntry() , который возвращает объект ZipEntry . Объект ZipEntry представляет отдельную запись в zip-архиве. Например, считаем какой-нибудь архив:
ZipInputStream в конструкторе получает ссылку на поток ввода. И затем в цикле выводятся все файлы и их размер в байтах, которые находятся в данном архиве.
Затем данные извлекаются из архива и сохраняются в новые файлы, которые находятся в той же папке и которые начинаются с «new».
Источник