Учу Java, решил написать что-то типа архиватора.
Собственно в output
вводим путь и название архива, типа : C://Folder/arhiv.zip
Дальше происходит что-то ужасное. В file
считываем путь к файлу который нам нужно закинуть в архив ( Типа : C://SomeFolder/text.txt
). Если там написано STOP
, значит все файлы введены и больше ничего толкать в архив не нужно. Ниже создаём ZipOutputStream
который принимает наш output
и FileInputStream
который принимает файлы которые нужно поместить в архив. Создаём ZipEntry
, в него толкаем названия считываемых файлов. Чтобы названия в архиве были такими же что были при считывании. Открываем putNextEntry
. Тут создаём массив байтов равный считываемому файлу и считываем его. Записываем его в output
и закрываем Entry
.
Вся проблема в том, что в архив попадает только последний введённый файл. Ввожу 2-3 файла, но в архиве остаётся только последний введённый. Что я делаю не так?
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Куда архив сохранять?");
String output = in.nextLine();
System.out.println("Укажите путь к файлу который нужно поместить в архив");
System.out.println("Когда вы введёте все файлы, введите STOP");
for (int i = 0; i < 10000; i++) {
File file = new File(in.nextLine());
if (file.getName().equals("STOP")){
System.exit(4);
}
try (ZipOutputStream zipout = new ZipOutputStream(new FileOutputStream(output));
FileInputStream zipin = new FileInputStream(file)) {
ZipEntry entry = new ZipEntry(file.getName());
zipout.putNextEntry(entry);
byte[] buffer = new byte[zipin.available()];
zipin.read(buffer);
zipout.write(buffer);
zipout.closeEntry();
}
catch(IOException ex){
System.out.println(ex.getMessage());
}
}
}
}
Открыл и закрыл zipout вне цикла, теперь копирует только первый файл введённый в список для архиватора. И копирует его странно, файл весит 0кб.
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("Куда архив сохранять?");
String output = in.nextLine();
System.out.println("Укажите путь к файлу который нужно поместить в архив");
System.out.println("Когда вы введёте все файлы, введите STOP");
try (ZipOutputStream zipout = new ZipOutputStream(new FileOutputStream(output))) {
for (int i = 0; i < 10000; i++) {
File file = new File(in.nextLine());
if (file.getName().equals("STOP")) {
System.exit(4);
}
try (FileInputStream zipin = new FileInputStream(file)) {
ZipEntry entry = new ZipEntry(file.getName());
zipout.putNextEntry(entry);
byte[] buffer = new byte[zipin.available()];
zipin.read(buffer);
zipout.write(buffer);
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
zipout.closeEntry();
}
catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
}
У вас на каждый файл создается новый объект zipout
, который с каждым новым файлом перезаписывается. Нужно создать zipout
до цикла и закрыть после:
ZipOutputStream zipout = new ZipOutputStream(new FileOutputStream(output));
for (int i = 0; i < 10000; i++) {
File file = new File(in.nextLine());
if (!(file.getName().equals("STOP"))) {
try (FileInputStream zipin = new FileInputStream(file)) {
ZipEntry entry = new ZipEntry(file.getName());
zipout.putNextEntry(entry);
byte[] buffer = new byte[zipin.available()];
zipin.read(buffer);
zipout.write(buffer);
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
} else {
zipout.closeEntry();
System.exit(4);
}
}
Так же нужно дополнить декларацию метода main():
public static void main(String[] args) throws IOException
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
При компиляции следующего кода на hyperskillorg выскакивает ошибка данного характера :
Пытаюсь написать веб сокет сервер на jettyВопрос достаточно не определенный, но надеюсь кто-то знает ответ
Пытаюсь запустить команду для командной строки с помощью RuntimegetRuntime()
Вроде простая задача и скорее всего решение какое то очевидное, но я что-то запуталсяЯ конечно могу что то закостылять индивидуально для...