— Привет, Амиго!
— Здравия желаю, Капитан Бобров!
— Готов к новой секретной миссии?
— Конечно готов, сэр!
— Тогда вот тебе файл с инструкциями. Сегодня мы будем разрабатывать новую версию искусственного интеллекта. Человечеству нужна наша помощь. Мы обязаны спасти людей от гибели.
— Но, сэр! Я не могу открыть файл. Нужен архиватор.
— Да? Кхм… Тогда спасение человечества переносится. Напишем сегодня собственный архиватор.

— Товарищ Капитан, а как же люди?
— Ничего с ними не случится. Обратись за заданием к агенту Intellij IDEA, там получишь все инструкции.
— Разрешите приступить, сэр?
— Приступайте.
16
Задача
Java Multithreading,
7 уровень,
15 лекция
Недоступна
Archiver (1)
Давай напишем архиватор. Архиватор, как минимум, должен уметь архивировать и разархивировать
файлы. Начнем с первого.
Нам потребуется менеджер архива. Он будет совершать операции над файлом архива (файлом, который
будет храниться на диске и иметь расширение zip). Класс, который будет этим заниматься
32
Задача
Java Multithreading,
7 уровень,
15 лекция
Недоступна
Archiver (2)
Сейчас мы напишем реализацию метода createZip(Path source), в котором мы будем архивировать файл,
заданный переменной source.
В Java есть специальный класс ZipOutputStream из пакета java.util.zip, который сжимает (архивирует)
переданные в него данные. Чтобы несколько файлов, сжимаемые в один архив,
16
Задача
Java Multithreading,
7 уровень,
15 лекция
Недоступна
Archiver (3)
Как видишь, архивировать оказалось не так уж и сложно. Но наш архиватор получился каким-то уж
слишком примитивным. Настоящий архиватор должен уметь гораздо больше: распаковку архива,
добавление нового файла в существующий архив, удаление файла из архива, просмотр содержимого
архива. Сейчас мы будем
16
Задача
Java Multithreading,
7 уровень,
15 лекция
Недоступна
Archiver (4)
Каждая команда подразумевает выполнение каких-то действий. Создадим интерфейс Command, с
методом execute() (execute – «выполнить» по-английски). Для каждой команды мы создадим свой
собственный класс. Все классы команд должны реализовывать (быть унаследованы) интерфейс Command.
Так как команд будет м
8
Задача
Java Multithreading,
7 уровень,
15 лекция
Недоступна
Archiver (5)
Разделим команды на два типа: те, которые работают непосредственно с архивом и вспомогательные
(например EXIT). Все команды первого типа, будут иметь общий функционал, его удобно вынести в какой-
то их общий базовый класс. Назовем этот класс ZipCommand. Он, как и все классы команд, должен
реализовыв
16
Задача
Java Multithreading,
7 уровень,
15 лекция
Недоступна
Archiver (6)
Представь, что пользователь сообщает нам с помощью переменной Operation operation, что он хочет
сделать. Тогда мы должны проверить значение этой переменной, создать объект соответствующего
класса команды и вызвать у него метод execute(). Чтобы не создавать объект класса нужной команды
каждый раз, ег
8
Задача
Java Multithreading,
7 уровень,
15 лекция
Недоступна
Archiver (7)
Мы много всего сделали и можно немного передохнуть.
Создадим, пакет exception и добавим в него два класса PathIsNotFoundException и WrongZipFileException.
Исключение PathIsNotFoundException будем кидать, если не сможем найти путь, в который нужно
распаковать архив, или путь к файлу, который хотим за
32
Задача
Java Multithreading,
7 уровень,
15 лекция
Недоступна
Archiver (8)
Чтобы узнать какую команду сейчас хочет выполнить пользователь, добавим метод Operation
askOperation() в класс Archiver. Этот метод должен вывести в консоль список доступных команд и
попросить выбрать одну из них. Для удобства будем просить ввести номер команды, где номер – это
порядковый номер кома
32
Задача
Java Multithreading,
7 уровень,
15 лекция
Недоступна
Archiver (9)
Теперь займемся другой, не менее важной частью нашего архиватора. Очень часто пользователь хочет
создать архив не из одного файла, а из целой папки. Тогда архивация сводится к поочередному
добавлению элемента ZipEntry для каждого файла в архив.
Нам нужно написать класс FileManager для получения спис
32
Задача
Java Multithreading,
7 уровень,
15 лекция
Недоступна
Archiver (10)
Пришло время отрефакторить класс ZipFileManager. В методе createZip есть код, который нам также
понадобится в методах, которые будут добавлять или удалять файл в архив, распаковывать его и т.д. Эти
методы мы будем реализовывать позже, но уже сейчас можем вынести общие части кода в отдельные
методы.
32
Задача
Java Multithreading,
7 уровень,
15 лекция
Недоступна
Archiver (11)
Давай наконец попробуем нормально реализовать метод execute() класса ZipCreateCommand, который
мы добавляли раньше. Для этого нужно:
1. В начале метода добавить вывод сообщения "Создание архива." Не забудь, что мы работаем с
консолью через методы класса ConsoleHelper.
2. Создай новый объект класса Z
16
Задача
Java Multithreading,
7 уровень,
15 лекция
Недоступна
Archiver (12)
Сегодня мы подготовимся к реализации команды ZipContentCommand. Она будет заниматься получением
содержимого архива. Содержимое архива – это упакованные файлы и папки, но нам было бы интересно
узнать не только имена объектов архива, но и их размер до и после сжатия, степень сжатия и метод
сжатия.
32
Задача
Java Multithreading,
7 уровень,
15 лекция
Недоступна
Archiver (13)
Продолжим наш путь к получению содержимого файла архива. Напишем метод getFilesList() в классе
ZipFileManager. Он будет возвращать список файлов в архиве, вернее список свойств этих файлов (класс
свойств FileProperties мы уже реализовали). Итак:
1. Добавь метод List<FileProperties> getFilesList() th
8
Задача
Java Multithreading,
7 уровень,
15 лекция
Недоступна
Archiver (14)
Все готово, чтобы реализовать метод execute() класса ZipContentCommand:
1. Выведи сообщение "Просмотр содержимого архива."
2. Создай объект класса ZipFileManager с помощью метода getZipFileManager()
3. Выведи сообщение "Содержимое архива:"
4. Получи список файлов архива с помощью метода getFilesList
32
Задача
Java Multithreading,
7 уровень,
15 лекция
Недоступна
Archiver (15)
Пора попробовать что-нибудь распаковать. Для этого добавим публичный метод void extractAll(Path
outputFolder) throws Exception в класс ZipFileManager. Path outputFolder - это путь, куда мы будем
распаковывать наш архив. У тебя уже большой опыт работы с элементами архива и потоками. Так что, я
дам то
32
Задача
Java Multithreading,
7 уровень,
15 лекция
Недоступна
Archiver (16)
Пришло время что-нибудь удалить из архива. Архив очень хитрая штука, нельзя вот так просто взять и
удалить какой-то элемент внутри него.
Почему? Представь, что мы решили сами придумать свой алгоритм сжатия текста. Посмотрев исходный
текст, мы видим, что в нем часто встречается фраза "быть программис
32
Задача
Java Multithreading,
7 уровень,
15 лекция
Недоступна
Archiver (17)
Осталась ерунда. Добавить добавление файла в архив. Звучит подозрительно, но именно этим мы и
займемся. Добавление файлов похоже на удаление, мы создаем временный файл архив, переписываем в
него все содержимое старого архива и добавляем новые файлы. Потом заменяем старый файл архива
новым.
1. Добавь
8
Задача
Java Multithreading,
7 уровень,
15 лекция
Недоступна
Archiver (18)
Ты отличный ученик, я немного подправил твой код, можешь использовать этот архиватор для архивации
в повседневной жизни. Если будет время и желание, попробуй добавить операцию изменения степени
сжатия архива!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ