Что я делаю не так? (Архиватор)

143
23 апреля 2019, 19:20

Учу 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());
    }
}

}

Answer 1

У вас на каждый файл создается новый объект 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
READ ALSO
Exception in thread &ldquo;main&rdquo; java.util.NoSuchElementException

Exception in thread “main” java.util.NoSuchElementException

При компиляции следующего кода на hyperskillorg выскакивает ошибка данного характера :

151
jetty websocket server

jetty websocket server

Пытаюсь написать веб сокет сервер на jettyВопрос достаточно не определенный, но надеюсь кто-то знает ответ

148
Проблема с Runtime.getRuntime().exec() Java

Проблема с Runtime.getRuntime().exec() Java

Пытаюсь запустить команду для командной строки с помощью RuntimegetRuntime()

141
Помогите с адаптивным гридом

Помогите с адаптивным гридом

Вроде простая задача и скорее всего решение какое то очевидное, но я что-то запуталсяЯ конечно могу что то закостылять индивидуально для...

163