Программа реализует три алгоритма сжатия данных без потерь:
- RLE (Кодирование длин серий)
- LZW (Лемпел-Зив-Велч)
- Huffman (Хаффмен)
Архиватор автоматически выбирает оптимальный алгоритм для каждого файла или позволяет явно указать метод. Поддерживается сжатие и восстановление любых текстовых и бинарных файлов.
mvn package
java -cp target/Lab2-1.0-SNAPSHOT.jar org.example.FileArchiver compress <RLE|LZW|HUFFMAN> input.txt output.arc
java -cp target/Lab2-1.0-SNAPSHOT.jar org.example.FileArchiver auto auto input.txt output.arc
java -cp target/Lab2-1.0-SNAPSHOT.jar org.example.FileArchiver decompress <RLE|LZW|HUFFMAN> output.arc restored.txt
mvn test
- Java JDK 21 (или совместимая версия)
- Maven (рекомендуется последняя версия, например 3.9.x)
- ОС: Windows, macOS, Linux (проект кроссплатформенный)
- Для запуска тестов и сборки: команда
mvn package
иmvn test
- Для запуска программы: команда
java -cp target/Lab2-1.0-SNAPSHOT.jar org.example.FileArchiver ...
- Установите JDK 21
- Установите Maven
- Проверьте, что команды
java -version
иmvn -v
работают в терминале
- Если в файле много длинных повторов — используется RLE.
- Если много повторяющихся подстрок — используется LZW.
- Если много уникальных символов — используется Хаффмен.
- Текст с длинными повторяющимися символами (RLE)
- Текст с повторяющимися словами/фразами (LZW)
- Случайные или разнообразные символы (Хаффмен)
- Бинарные файлы
Тип данных | RLE | LZW | Хаффмен |
---|---|---|---|
Повторяющиеся символы | до 90% | низкий | средний |
Повторяющиеся фразы/слова | низкий | до 70% | средний |
Случайные/уникальные | низкий | низкий | до 40% |
Бинарные файлы | зависит | зависит | зависит |
RLE
- Эффективен для данных с длинными последовательностями одинаковых символов (например, пробелы, нули).
- Коэффициент сжатия может достигать 80-90%.
- Недостаток: плохо работает на текстах без повторов, может даже увеличить размер.
LZW
- Хорошо сжимает тексты с повторяющимися словами, фразами, шаблонами.
- Коэффициент сжатия обычно 40-70% для текстов, хуже для случайных данных.
- Преимущество: не требует хранения словаря в архиве.
- Недостаток: неэффективен для уникальных или случайных данных.
Хаффмен
- Универсальный алгоритм, хорошо работает на любых данных, особенно если есть часто встречающиеся символы.
- Коэффициент сжатия обычно 20-40% для текстов, до 33% для случайных байтов.
- Преимущество: всегда уменьшает размер, если частоты символов различаются.
- Недостаток: требует хранения дерева в архиве, что уменьшает выигрыш на малых файлах.
- Для файлов с большими повторяющимися блоками выгоднее использовать RLE.
- Для текстов с повторяющимися словами и шаблонами — LZW.
- Для разнообразных и случайных данных — Huffman.
- Автоматический выбор позволяет достичь оптимального сжатия без ручного анализа.
- Все алгоритмы реализованы без сторонних библиотек, легко расширяются и тестируются.
- Все алгоритмы корректно сжимают и восстанавливают данные без потерь.
- Автоматический выбор алгоритма позволяет достичь лучшего сжатия для разных типов файлов.
- Программа легко расширяется и сопровождается подробными комментариями.
- Тесты подтверждают корректность работы на различных наборах данных.
- Для восстановления требуется знать использованный алгоритм (или хранить его в метаданных).
- Для проверки используйте команду
mvn test
— все тесты должны проходить. - Для ручной проверки используйте команды из раздела "Запуск".
- Исходный код снабжен подробными комментариями и докстрингами.
- Программа не использует сторонние библиотеки для сжатия.
- Для расширения можно добавить новые алгоритмы или улучшить эвристику выбора.
- В начале каждого архивного файла записан 1 байт, который указывает используемый алгоритм:
- 0 — RLE
- 1 — LZW
- 2 — Хаффмен
- Это позволяет полностью автоматизировать разархивацию: программа сама определяет нужный метод.
java -cp target/Lab2-1.0-SNAPSHOT.jar org.example.FileArchiver decompress auto output.arc restored.txt
Автор: Марченко Дмитрий