JavaRush /Курсы /Java Multithreading /Большая задача: Пишем архиватор на Java

Большая задача: Пишем архиватор на Java

Java Multithreading
7 уровень , 15 лекция
Открыта

— Привет, Амиго!

— Здравия желаю, Капитан Бобров!

— Готов к новой секретной миссии?

— Конечно готов, сэр!

— Тогда вот тебе файл с инструкциями. Сегодня мы будем разрабатывать новую версию искусственного интеллекта. Человечеству нужна наша помощь. Мы обязаны спасти людей от гибели.

— Но, сэр! Я не могу открыть файл. Нужен архиватор.

— Да? Кхм… Тогда спасение человечества переносится. Напишем сегодня собственный архиватор.

Большая задача: Пишем архиватор на Java - 1

— Товарищ Капитан, а как же люди?

— Ничего с ними не случится. Обратись за заданием к агенту 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)
Ты отличный ученик, я немного подправил твой код, можешь использовать этот архиватор для архивации в повседневной жизни. Если будет время и желание, попробуй добавить операцию изменения степени сжатия архива!
Комментарии (240)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Алексей Уровень 45
27 апреля 2025
Еще не начал, но чувствую, что пустая трата времени. Эх( Начинаем...
Алексей Уровень 45
30 апреля 2025
забираю слова обратно! сложно, взрыв мозга!(
Anonymous #3473304 Уровень 48
15 апреля 2025
Archiver (15) (описание условия задачи без головоломок и загадок) Cоздаём и реализуем публичный метод void extractAll(Path outputFolder) throws Exception: 1. Проверяем существует ли zip файл, если не существует - кидаем WrongZipFileException. 2. Создаём входящий поток из этого файла 2.1. Создаем директорию вывода, если она не существует 2.2. Используя ZipEntry проходимся по содержимому zip потока (файла) 3. В цикле: 3.1. создаём полное имя из outputFolder и получанного имени из текущего ZipEntry 3.2. создаем директорию из текущего полного имени (если её нет) 3.3. открываем исходящий поток и передаем в него полное имя 3.4. копируем данные используя copyData из потока zip (п.2) в исходящий поток (п.3.3) 3.5. не забываем о переключении zipEntry. Подсказки: zipFile - это файл, который мы распаковываем. outputFolder - это директория, куда мы распаковываем.
23 апреля 2024
Вообще не связано с многопоточностью. Просто наработали работу 10 раз подряд с ZipStream/. Потратил неделю на воздух.
Andrew Karev Уровень 51
8 мая 2024
Неделю?
Андрей Уровень 51
17 марта 2024
последние задачи уже скипал
Юрій Якимчук Уровень 33
12 марта 2024
Пишемо архІватор 1. Берете java.util.zip...
Egor Уровень 51
20 декабря 2023
сложные последние задачи оказались, лучше 1 уровень 4 модуля пройти, чтобы особых затруднений не было.
murtagh Уровень 46
27 ноября 2023
какие данные ввести при нулевой операции? ввел полный путь пустой папки и полный путь текстового файла всегда пишет Вы не выбрали файл архива или выбрали неверный файл.
milniy87 Уровень 41
21 февраля 2023
Для тех кто хочет многопоточности можете добавить для асинхронной архивации)))
Lightselect Уровень 41
10 февраля 2023
я не понимаю, а причем тут многопоточность? Когда мы будем использовать synchronized collections и Concurrent сollections в задачах??
kalkulator¹ Уровень 51
9 февраля 2023
яка то діч