Добавление файла в архив

  • 28
  • Недоступна
В метод main приходит список аргументов. Первый аргумент - полный путь к файлу fileName. Второй аргумент - путь к zip-архиву. Добавить файл (fileName) внутрь архива в директорию 'new'. Если в архиве есть файл с таким именем, то заменить его. Пример входных данных: C:/result.mp3 C:/pathToTest/test.z
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (221)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Скорпофео Григорий
Уровень 46, Пермь, Россия
10 июля, 18:44
Перешел на курс коллекций после задачи по написанию архиватора, а тут опять эти архивы
Николай Т.
Уровень 36, Рязань, Россия
24 июня, 23:59
Пожалуйста объясните, если файл имеется в архиве, это означает: 1. Он имеется в папке new? 2. Он имеется в любой папке? 3. Он имеется в корневой папке архива? Как именно заменить файл: 1. В любом случае удалить старый и записать в папку new? 2. Только перезаписать, если он имеется в какой-либо папке в ту же папку? Если такого файла в папке new нет, добавить в любом случае? Помогите ответить на такую викторину. Не знаю что на меня нашло, но я решил выяснить всё методом тыка. Код который приняло работает так: Если архив содержит новый файл где угодно, то перезаписать, если не содержит, добавить в папку new в архив, не забыть при этом обязательно использовать Files.copy, хоть удобней по другому. Ещё использовал Files.delete(старый архив), перед записью нового, но это уже наверно паранойя.
Maks Panteleev
Уровень 37, Москва, Россия
24 июня, 16:16
Я сделал просто и красиво. 1)Сначала разархивировал заданный архив во временную папку
ZipInputStream zipInputStream = new ZipInputStream(Files.newInputStream(Paths.get(args[0])));
Path tempPath = Files.createTempDirectory(null,null);
2) Все файлы скопировал в List<Path>. Потом скопировал в эту же темп папку нужный файл args[0] и его же добавил в список. 3) Итерацией по полученному списку перезаписал все в исходный архив (формально говоря, создал новый с таким же именем) Валя конечно же не примет, он там таких методов не знает даже, их не было в его 8 джаве)
Files.readAllBytes(paths)
Светлана
Уровень 33
15 июня, 14:00
Не заморачивалалсь с мапой и т.п. В классе Solution можно сделать два поля String и byte[], конструктор Solution(String, byte[]) и метод void writeEntry(ZipOuputStream). В процессе вместо мапы формировать список из Solution и использовать этот список Solution_ов. Валидатор принял такое решение. Канючил только из-за того, что я умудрялась при считывании информации из ZipEntry определять размер массива через entry.getSize(). Но когда этот косяк исправила, все зашло на раз. Может кому-то поможет идея с листом из Солюшенов, чтобы не оперировать сложноструктурной мапой 😀
Destr
Уровень 24, Россия
28 мая, 19:48
Ну и задачка - точнее: ну и условие. Почему нельзя было сразу написать, что fileName надо заменять только в том случае, если файл с точно таким же названием существует уже в архиве именно под папкой new?? Получается, что надо сначала все файлы из архива куда то скопировать (Я это сделал в List<ByteArrayOutputStream()>, при этом их имена сохранял в List<String>, хотя то, что дается в авторском решении List<Content>, то есть объединение имени и содержимого в рамках одного объекта будет идейно более правильным решением). После копирования файл fileName записываем в архив в папку new (сам архив при этом создается заново) с помощью Files.copy. Далее из сохраненного List записываем остальные файлы привычным write, следя за тем, что если попался "new/fileName", то его пропускаем. Следить за тем, что fileName в архив записываем именно через Files.copy. Я вначале тоже его сохранил в ByteArrayOutputStream() - валидатор ругался на всё, хотя у меня на компьютере разные вариации записи в архив замечательно работали. Изменил на Files.copy - все равно ругается, правда сохранение в ByteArrayOutputStream() не убирал пока, полагая, что тот кусок кода ни на что не влияет. После долгих мучений и раздумий, что у меня не так, решил чуть сократить программу, убрал сохранение fileName в ByteArrayOutputStream() - просто стер несколько строк, ничего не изменяя в остальных и чудо - валидатор принял задачу! В целом, надо признать, что мучения над этой задачей заставили получше понять работу с архивами и потоками. Надеюсь, кому-нибудь мой ход решения может пригодиться.
Blame
Уровень 29, Омск, Россия
4 июня, 05:30
после первой легкой, эта задача не такая жутка..
Игорь Ходыко Enterprise Java Developer
27 мая, 17:23
Эта задача осталась для меня загадкой. Я с трудом понимаю, что нужно делать. В голове роятся ZipEntry, byte[], файлы, вопросы сколько, чего, где. Списывать её не хочется, но и разобраться не получается. Я надеюсь вернусь через какое то время и решу её уверенно.
Dmitry Panchenko
Уровень 24, Москва, Россия
22 мая, 07:58
Жалко, что Валя не знает про readAllBytes()
hidden #2322530
Уровень 41
6 июня, 12:23
этот метод появился в Java9, валидатор работает на Java8
Zevs
Уровень 35, Москва, Россия
1 мая, 07:27
У меня было абсолютно правильное решение, но задача не проходила по всем пунктам, просто потому что валидатор захотел, чтобы было так:
try (ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(args[1]))) {
...
}
В то время как мой код был таким:
Path zipPath = Paths.get(args[1]);
...
try (ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(zipPath))) {
...
}
Будьте внимательны, пожалуйста. В задаче запрещается присваивать объекту другого класса значение args[1], нужно сразу непосредственно в поток его засунуть. Я потратила 3 часа, думая, что я вообще не поняла тему, и что сделала все неправильно. Если б не заглянула в комментарии, так и билась бы дальше. Админы, распишите, пожалуйста, условия и требования понятнее.
Flexo Bending Unit #3370318
6 мая, 13:31
у задачи рейтинг 1.5 - не мудрено, у меня уже правило: с таким мусорным рейтингом надо сначала читать комментарии, а потом выстраивать логику решения 😏
Davilalexius
Уровень 34, Москва, Россия
10 апреля, 07:01
"Добавить файл (fileName) внутрь архива в директорию 'new'. Если в архиве есть файл с таким именем, то заменить его."-> Заменить его, не создавая папку new и не впихивая оный в неё! filesFromArch.get(i).toString() -имена для новых зипэнтри можно доставать из (Path). Не делайте filesFromArch.get(i).getFileName().toString()!
Dmitry Vasilyev
Уровень 26, Саратов, Россия
29 марта, 17:46
Последнее время перед тем, как приступать к решению, я как-то всё меньше читаю официальные условия к задачам и всё больше - комментарии... 🤦‍♂️