JavaRush
AI Academy
new
Акция
Университет
Java FullStack
Python FullStack
AI Native Developer
new
Web FullStack
Обучение
Курсы
Задачи
Опросы
Игры
Помощь
График пинков
Стажировка
Сообщество
Пользователи
Форум
Чат
Статьи
Истории успеха
Активности
Отзывы
Подписки
Светлая тема
Вопрос
  • Отзывы
  • О нас
  • CS50
Начать
Начать обучение
Начать обучение
  • Все вопросы
JavaRush/Помощь по Java задачам/Комрады помогите, валидатор на все ругается... Что я уже ...
Евгений
40 уровень
  • 30.04.2022
  • 454просмотров
  • 11комментариев

Комрады помогите, валидатор на все ругается... Что я уже не понимаю условия, что значит собрать архив из элементов, это не отдельные архивы?

Вопрос по задаче Разархивируем файл
Java Collections,  1 уровень,  6 лекция
Решен


В метод main приходит список аргументов.
Первый аргумент - имя результирующего файла resultFileName, остальные аргументы - имена файлов fileNamePart.
Каждый файл (fileNamePart) - это кусочек zip архива. Нужно разархивировать целый файл, собрав его из кусочков.
Записать разархивированный файл в resultFileName.
Архив внутри может содержать файл большой длины, например, 50Mb.
Внутри архива может содержаться файл с любым именем.

Пример входных данных. Внутри архива находится один файл с именем abc.mp3:
C:/result.mp3
C:/pathToTest/test.zip.003
C:/pathToTest/test.zip.001
C:/pathToTest/test.zip.004
C:/pathToTest/test.zip.002

Требования:
  • В методе main нужно создать ZipInputStream для архива, собранного из кусочков файлов. Файлы приходят аргументами в main, начиная со второго.
  • Создай поток для записи в файл, который приходит первым аргументом в main. Запиши туда содержимое файла из архива.
  • Поток для чтения из архива должен быть закрыт.
  • Поток для записи в файл должен быть закрыт.
....
package com.javarush.task.task31.task3106; import java.io.*; import java.nio.file.Files; import java.nio.file.Path; import java.util.Arrays; import java.util.Comparator; import java.util.function.Supplier; import java.util.stream.Collector; import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; /* Разархивируем файл */ public class Solution { public static void main(String[] args) { String [] zips = new String[args.length-1]; for (int i = 0; i < zips.length; i++) { zips[i] = args[i+1]; } zips = sortedArguments(zips); // Arrays.stream(zips).forEach(System.out::println); try (FileOutputStream out = new FileOutputStream(args[0], true);) { for (int i = 0; i < zips.length; i++) { try (ZipInputStream in = new ZipInputStream(new FileInputStream(zips[i]))) { ZipEntry zip = in.getNextEntry(); byte[] bytes = new byte[1024]; long b = zip.getSize(), a = 0; while (b > a) { int x = in.read(bytes); a += x; out.write(bytes, 0, x); } in.closeEntry(); } catch (Exception e){ e.printStackTrace(); } } } catch (Exception e){ e.printStackTrace(); } } public static String[] sortedArguments(String ... args){ Comparator<String> comparator = new Comparator<String>() { @Override public int compare(String o1, String o2) { int a1 = Integer.parseInt(o1.substring(o1.lastIndexOf(".")+1)); int a2 = Integer.parseInt(o2.substring(o2.lastIndexOf(".")+1)); return a1-a2; } }; return Arrays.stream(args).sorted(comparator).map(o1 -> o1.substring(0,o1.lastIndexOf("."))).toArray(String[]::new); } }
0
Комментарии (11)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Zlata
Уровень 49
1 мая 2022, 11:48
тттт
+2
Евгений
Уровень 40
1 мая 2022, 12:44
W?
0
Zlata
Уровень 49
2 мая 2022, 09:59
я просто написала коммент чтобы самой себе на него поставить правильное решение мне это для достижения надо было
+1
Борис МоскалевBackend Developer в Прикладные технологи
30 апреля 2022, 18:15решение
Привет. Смотри для начала забиваешь все имена кусков в список строк и сортируешь его через метод sort из Collection. Потом создаешь список FileInputStream и туда забиваешь открытые потоки для имен из списка. Создаешь ZipInputStream из SequenceInputStream с аргументом того списка. Ну а дальше у тебя вроде все ном
+2
Евгений
Уровень 40
1 мая 2022, 10:50
Привет, спасибо, сейчас попробую)
0
Евгений
Уровень 40
1 мая 2022, 11:34
public static void main(String[] args) throws Exception { List<String> lists = new ArrayList<>(); for (int i = 1; i < args.length; i++) { lists.add(args[i]); } Collections.sort(lists); Vector<InputStream> inputStreams = new Vector<>(); for (String zip:lists) inputStreams.add(new FileInputStream(zip)); ZipInputStream zipInputStream = new ZipInputStream(new SequenceInputStream(inputStreams.elements())); FileOutputStream outputStream = new FileOutputStream(args[0],true); while (zipInputStream.available()>0){ ZipEntry zip = zipInputStream.getNextEntry(); byte[] bytes = new byte[1024]; try{ long b = zip.getSize(), a = 0; while (b > a) { int x = zipInputStream.read(bytes); a += x; outputStream.write(bytes, 0, x); }} catch (NullPointerException e){ zipInputStream.getNextEntry(); } } }
0
Евгений
Уровень 40
1 мая 2022, 11:35
Получается открывает 1 архив а дальше закрывает поток и все
0
Борис МоскалевBackend Developer в Прикладные технологи
1 мая 2022, 15:12полезный
Ух. я чет еще векторы не использовал. У меня вместо этого List<FileInputStream> inputStreams = new ArrayList<>(); for (String allNames : names) { inputStreams.add(new FileInputStream(allNames)); } Ну и я еще до кучи добавлял закрытия closeEntryю Да и outputStream тоже закрывал. Не знаю влияло ли это на выполнение задачи
+1
Евгений
Уровень 40
1 мая 2022, 17:46
Спасибо, прошло... только странно... если в моем решении первом лепило две мп3 в одну(склеивало), то сейчас записывает в результ одну и все, но валидатор пропускает))
0
Борис МоскалевBackend Developer в Прикладные технологи
1 мая 2022, 18:40
Ну да, иногда решение у тебя верное но валидатор не пропускает. И приходится ваще копировать из готового решения код.
+2
Alexey Maleev Software Developer
1 декабря 2022, 14:20
Вот ты ленивец Борян! :-) Можно так попробовать, и так попробовать, можно посмотерть в вопросах как народ делает... но копировать готовое решение.. да ну нафиг
+1
Обучение
  • Курсы программирования
  • Регистрация
  • Курс Java
  • Помощь по задачам
  • Цены
Сообщество
  • Пользователи
  • Статьи
  • Форум
  • Чат
  • Истории успеха
  • Активности
Компания
  • О нас
  • Контакты
  • Отзывы
  • FAQ
  • Поддержка
JavaRushJavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.
Подписывайтесь
Язык интерфейса
Русский
English Українська
"Программистами не рождаются" © 2026 JavaRush
MastercardVisa
"Программистами не рождаются" © 2026 JavaRush