Для пользователей, которые регистрируются. Если Вам не приходит письмо с подтверждением email, пишите на admin[at]quizful[dot]net - будем подтверждать вручную. Просим прощения за доставленные неудобства.

С уважением,
команда Quizful
Знаете ли Вы, что

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

Топ контрибуторов
loading
loading
Лента обновлений
ссылка May 17 19:13
Комментарий от elirijndael:
Полностью согласен с valid_name.
ссылка May 17 18:47
Комментарий от Aleksandr89:
Неплохой тест. Для тех кто хочет ещё попрактиковатьс...
ссылка May 17 15:13
Комментарий от dpdpdp:
Поменяйте радиокнопки на чекбоксы.
Во втором варианте про...
ссылка May 17 11:55
Комментарий от Torredo812:
вот это подвох!!!
забываешь что х увеличился))и думае...
ссылка May 17 10:50
Комментарий от lesha1980:
Хороший вопрос. Получается, что проверяется только x в...
Статистика

Тестов: 130, вопросов: 5791. Пройдено: 126757 / 526596.

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

head tail Информация о статье
категория
Java
дата05.08.2010
авторwisd
голосов6

Считывание содержимого 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();

Если Вам понравилась статья, проголосуйте за нее

Голосов: 6  loading...
scream3r   dreamnewq   zZoMROT   random1st   samhane   NordLad