/
Dixix404
/
String_compression
Обзор
Документация
Войти
/
Dixix404
/
String_compression
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Library functions/src/main/java/org/example/cli/Main.java
181 строка
7 KB
Dixix404
Lz78 Algorithm + changing keys structure + Проверка работы Алгоритмов на большом текстовом файле
15 дек 2025, 21:10
15 дек 2025, 21:10
9a96cad
Код
Авторство
О чём код?
package org.example.cli; import org.example.Compressor; import org.example.HuffmanCompressor; import org.example.FanoCompressor; import org.example.ShannonCompressor; import org.example.BookStackCompressor; import org.example.AdaptiveHuffmanCompressor; import org.example.GilbertCompressor; import org.example.Lz77Compressor; import org.example.Lz78Compressor; import java.io.*; import java.nio.file.Files; import java.nio.file.Path; public class Main { public static void main(String[] args) { try { // Парсим аргументы командной строки CommandLineArgs parsedArgs = parseArguments(args); // Если запросили помощь - выводим и завершаемся if (parsedArgs.help) { printHelp(); System.exit(0); } // Проверяем обязательные параметры if (parsedArgs.inputFile == null || parsedArgs.outputFile == null || parsedArgs.algorithm == null) { System.err.println("Ошибка: требуются параметры -i, -o и -a"); printHelp(); System.exit(1); } // Проверяем существование входного файла Path inputPath = Path.of(parsedArgs.inputFile); if (!Files.exists(inputPath)) { System.err.println("Ошибка: входной файл не существует: " + parsedArgs.inputFile); System.exit(1); } // Проверяем существование выходного файла Path outputPath = Path.of(parsedArgs.outputFile); if (Files.exists(outputPath) && !parsedArgs.force) { System.err.println("Файл существует. Если хотите его переписать, то укажите ключ -f"); System.exit(1); } // Получаем нужный компрессор по имени алгоритма Compressor compressor = getCompressor(parsedArgs.algorithm); if (compressor == null) { System.err.println("Ошибка: неизвестный алгоритм: " + parsedArgs.algorithm); System.err.println("Доступные: huffman, fano, shannon, adaptivehuffman, bookstack, gilbert, lz77, lz78"); System.exit(1); } // Выполняем сжатие или распаковку try (InputStream in = new FileInputStream(inputPath.toFile()); OutputStream out = new FileOutputStream(outputPath.toFile())) { if (parsedArgs.extract) { compressor.decompress(in, out); System.out.println("Распаковка завершена: " + parsedArgs.outputFile); } else { compressor.compress(in, out); System.out.println("Сжатие завершено: " + parsedArgs.outputFile); } } } catch (IOException e) { System.err.println("Ошибка ввода-вывода: " + e.getMessage()); System.exit(1); } catch (Exception e) { System.err.println("Ошибка: " + e.getMessage()); e.printStackTrace(); System.exit(1); } } /** * Парсит аргументы командной строки */ private static CommandLineArgs parseArguments(String[] args) { CommandLineArgs result = new CommandLineArgs(); for (int i = 0; i < args.length; i++) { String arg = args[i]; switch (arg) { case "-h": case "--help": result.help = true; break; case "-i": if (i + 1 < args.length) { result.inputFile = args[++i]; } break; case "-o": if (i + 1 < args.length) { result.outputFile = args[++i]; } break; case "-f": result.force = true; break; case "-x": case "--extract": result.extract = true; break; case "-a": case "--algorithm": if (i + 1 < args.length) { result.algorithm = args[++i]; } break; default: System.err.println("Неизвестный параметр: " + arg); } } return result; } /** * Возвращает компрессор по имени алгоритма */ private static Compressor getCompressor(String algorithm) { return switch (algorithm.toLowerCase()) { case "huffman" -> new HuffmanCompressor(); case "fano" -> new FanoCompressor(); case "shannon" -> new ShannonCompressor(); case "adaptivehuffman" -> new AdaptiveHuffmanCompressor(); case "bookstack" -> new BookStackCompressor(); case "gilbert" -> new GilbertCompressor(); case "lz77" -> new Lz77Compressor(); case "lz78" -> new Lz78Compressor(); default -> null; }; } /** * Выводит справку по использованию программы */ private static void printHelp() { System.out.println("Использование: java -jar library-functions.jar [параметры]"); System.out.println(); System.out.println("Параметры:"); System.out.println(" -i <файл> Входной файл"); System.out.println(" -o <файл> Выходной файл"); System.out.println(" -f Перезаписать выходной файл, если существует"); System.out.println(" -x, --extract Режим распаковки (по умолчанию - сжатие)"); System.out.println(" -a, --algorithm <алг> Алгоритм сжатия:"); System.out.println(" huffman, fano, shannon, adaptivehuffman,"); System.out.println(" bookstack, gilbert, lz77, lz78"); System.out.println(" -h, --help Показать эту справку"); System.out.println(); System.out.println("Примеры:"); System.out.println(" java -jar library-functions.jar -i input.txt -o output.bin -a huffman"); System.out.println(" java -jar library-functions.jar -i output.bin -o restored.txt -a huffman -x"); } /** * Вспомогательный класс для хранения распарсенных аргументов */ private static class CommandLineArgs { String inputFile = null; String outputFile = null; String algorithm = null; boolean force = false; boolean extract = false; boolean help = false; } }