Try English version of Quizful



Раздаем бесплатные Q! подробности в группе Quizful.Alpha-test
Топ контрибуторов
loading
loading
Знаете ли Вы, что

Вы можете подписаться на RSS ленту новых тестов сервиса Quizful, в том числе и отдельно по каждой категории

Лента обновлений
ссылка 14:04:08
Комментарий от coven:
а почему разные маски? разве у второго ПК не долдна быть т...
ссылка 12:42:02
Комментарий от zyurii:
Вибачаюсь за свого співвітчизника. І погоджуюсь з Вашим т...
ссылка Jul 21 23:10
Комментарий от KlimAndr:
если бы речь шла об одной акции и 99 споров и вопросов ...
ссылка Jul 21 22:36
Комментарий от KlimAndr:
? по первым двум буквам , видно,что три младшие линии ...
ссылка Jul 21 21:46
Комментарий от KlimAndr:
мне понравилось.+
Статистика

Тестов: 153, вопросов: 8599. Пройдено: 411050 / 2001595.

Zip-архивирование в Java

head tail Статья
категория
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();


Сжатие объектов с сохранением

Имеется класс "Работник" реализующий интерфейс для сериализации:

import java.io.*;

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  loading...
scream3r   dreamnewq   zZoMROT   random1st   samhane   NordLad   Swamp   Giggs13   SamTan