Чтение онлайн

на главную - закладки

Жанры

Философия Java3

Эккель Брюс

Шрифт:

Хотя существует великое количество различных программ сжатия данных, форматы ZIP и GZIP используются, пожалуй, чаще всего. Таким образом, вы можете легко манипулировать своими сжатыми данными с помощью многочисленных программ, предназначенных для чтения и записи этих форматов.

Простое сжатие в формате GZIP

Интерфейс сжатия данных в формате GZIP является наиболее простым и идеально подходит для ситуаций, где имеется один поток данных, который необходимо уплотнить (а не разрозненные фрагменты данных). В следующем примере сжимается файл:

// io/GZIPcompress java // {Параметры- GZIPcompress.java} import java util zip *, import java io *.

public class GZIPcompress {

public static void main(String[] args)

throws IOException { продолжение &

if(args.length == 0) {

System out.printlnC

"Использование: \nGZIPcompress file\n" + "иИспользует

метод GZIP для сжатия " + "файла в архив test.gz"); System.exit(l),

}

BufferedReader in = new BufferedReader( new FileReader(args[0])),

BufferedOutputStream out = new BufferedOutputStrearrK new GZIPOutputStreamC

new FileOutputStreamC'test gz"))),

System.out.println("3anncb файла");

int с;

while((c = in.readO) != -1) out.write(c);

in.closeO;

out.closeO;

System.out.printlnC"Чтение файла");

BufferedReader in2 = new BufferedReader(

new InputStreamReader(new GZIPInputStreamC new FilelnputStreamC'test gz")))).

String s;

while((s = in2 readLineO) != null) System.out.printin(s);

}

} ///:-

Работать с классами сжатия данных очень просто: вы просто надстраиваете их для своего потока данных (GZIPOutputStream или ZipOutputStream для сжатия, GZIPInputStream или ZipInputStream для распаковки данных). Дальнейшее сводится к элементарным операциям ввода/вывода. В примере продемонстрированы смешанные байтовые и символьные потоки: поток in основан на Reader, тогда как конструктор класса GZIPOutputStream использует только потоки на основе OutputStream, но не Writer. Поэтому при открытии файла поток GZIPInputStream преобразуется в символьный поток Reader.

Многофайловые архивы ZIP

Библиотека, поддерживающая формат сжатия данных ZIP, обладает гораздо более широкими возможностями. С ее помощью можно легко упаковывать произвольное количество файлов, а для чтения файлов в формате ZIP даже определен отдельный класс. В библиотеке поддержан стандартный ZIP-формат, поэтому сжатые ею данные будут восприниматься практически любым упаковщиком. Структура следующего примера совпадает со структурой предыдущего, но количество файлов, указываемых в командной строке, не ограничено. Вдобавок демонстрируется применение класса Checksum для получения и проверки контрольной суммы. Таких типов контрольных сумм в Java два: один представлен классом АсИег32'(этот алгоритм быстрее), а другой — классом CRC32 (медленнее, но точнее).

//: io/ZipCompress.java

// Использование формата ZIP для сжатия любого

// количества файлов, указанных в командной строке.

// {Параметры. ZipCompress java}

import java.util zip *;

import java io *;

import java.util *,

import static net mindview.util Print *,

public class ZipCompress {

public static void mainCString[] args) throws IOException {

FileOutputStream f = new FileOutputStreamC'test zip"). CheckedOutputStream csum =

new CheckedOutputStream(f. new Adler320). ZipOutputStream zos = new ZipOutputStream(csum). BufferedOutputStream out =

new BufferedOutputStream(zos). zos setComment("Проверка ZIP-сжатия Java"). //

Однако парного метода для получения комментария // getCommentO не существует for(String arg . args) {

print("3anncb файла " + arg). BufferedReader in =

new BufferedReader(new FileReader(arg)); zos putNextEntry(new ZipEntry(arg)). int c.

while((c = in readO) != -1)

out write(c); in closeO. out flushO.

}

out closeO.

// Контрольная сумма становится действительной

// только после закрытия файла с архивом!

pri nt ("Checksum " + csum getChecksum getValueO);

// Теперь извлекаем файлы-

ргШСЧтение файла").

Fi 1 elnputStream fi = new FilelnputStreamCtest zip"). CheckedlnputStream csumi =

new CheckedInputStream(fi. new Adler320); ZipInputStream in2 = new ZipInputStream(csumi). BufferedlnputStream bis = new BufferedInputStream(in2). ZipEntry ze.

while((ze = in2 getNextEntry) != null) { printCReading file " + ze). int x;

while((x = bis readO) != -1) System out write(x).

}

if(args.length == 1)

print("Контрольная сумма " + csumi getChecksum getValueO), bis closeO.

// Альтернативный способ открытия и чтения

// файлов в формате ZIP•

ZipFile zf = new ZipFi1e("test zip").

Enumeration e = zf entriesO;

while(e hasMoreElementsO) {

ZipEntry ze2 = (ZipEntry)e nextElement.

printCFile. " + ze2). продолжение &

// ... затем данные извлекаются так же. как прежде

}

/* if(args length == 1) */

}

} ///:-

Для каждого файла, добавляемого в архив, необходимо вызвать метод put-NextEntry с соответствующим объектом ZipEntry. Класс ZipEntry содержит все необходимое для добавления к отдельной записи Z IP-файла дополнительной информации: имени файла, размера в сжатом и обычном виде, контрольной суммы CRC, дополнительных данных, комментариев, метода сжатия, признака каталога. В исходном формате ZIP также можно задать пароли, но библиотека Java не поддерживает эту возможность. Аналогичное ограничение встречается и при использовании контрольных сумм: потоки CheckedlnputStream и Checked-OutputStream поддерживают оба вида контрольных сумм — и Adler32, и CRC32, однако в классе ZipEntry поддерживается только CRC. Это ограничение вынужденное, поскольку продиктовано требованиями формата ZIP, однако при этом быстрая контрольная сумма Adler32 оказывается в неравных условиях с CRC.

Поделиться:
Популярные книги

Мифология греков и римлян

Лосев Алексей Федорович
Документальная литература:
публицистика
7.00
рейтинг книги
Мифология греков и римлян

Далекая страна. Тетралогия

Кош Алекс
Ремесло
Фантастика:
фэнтези
9.10
рейтинг книги
Далекая страна. Тетралогия

Животворящая сила

Сытин Георгий Николаевич
Научно-образовательная:
психология
медицина
7.00
рейтинг книги
Животворящая сила

Тень Гегемона

Кард Орсон Скотт
2. Эндер Виггин. Сага теней
Фантастика:
научная фантастика
7.11
рейтинг книги
Тень Гегемона

Легенды древнего Хенинга (сборник)

Олди Генри Лайон
Фантастика:
научная фантастика
5.00
рейтинг книги
Легенды древнего Хенинга (сборник)

Архимаг. Пробуждение. Трилогия

Рудазов Александр
56. В одном томе
Фантастика:
научная фантастика
9.32
рейтинг книги
Архимаг. Пробуждение. Трилогия

Газлайтер. Том 10

Володин Григорий Григорьевич
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Жизнь способ употребления

Перек Жорж
Проза:
современная проза
5.00
рейтинг книги
Жизнь способ употребления

Ветхий Завет. Перевод и комментарии

Щедровицкий Дмитрий Владимирович
Религия и эзотерика:
прочая религиозная литература
5.00
рейтинг книги
Ветхий Завет. Перевод и комментарии

Евреи, Христианство, Россия. От пророков до генсеков

Кац Александр Семенович
Великие противостояния
Научно-образовательная:
история
культурология
5.00
рейтинг книги
Евреи, Христианство, Россия. От пророков до генсеков

Неучтенный элемент. Том 1

NikL
1. Антимаг. Вне системы
Фантастика:
городское фэнтези
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 1

Князь Андер Арес 3

Грехов Тимофей
3. Андер Арес
Фантастика:
рпг
аниме
фэнтези
5.00
рейтинг книги
Князь Андер Арес 3

Кремль. Президенты России. Стратегия власти от Б. Н. Ельцина до В. В. Путина

Млечин Леонид Михайлович
Документальная литература:
публицистика
6.00
рейтинг книги
Кремль. Президенты России. Стратегия власти от Б. Н. Ельцина до В. В. Путина

Сборник.Том 8

Азимов Айзек
8. Отцы-основатели. Весь Азимов
Фантастика:
научная фантастика
5.00
рейтинг книги
Сборник.Том 8