Как добавить уже имеющиеся на пк файлы в zip архив при помощи логики java\groovy?

Есть код, необходимо за время одной итерации записать еще 3 файла в архив, они статичные, не нуждаются в параметризации.

import java.nio.charset.StandardCharsets

def destination = new java.util.zip.ZipOutputStream(new FileOutputStream(new File('request' + ${__Random(100000,200000,)} + '.zip')), StandardCharsets.UTF_8)
destination.putNextEntry(new java.util.zip.ZipEntry(prev.getSampleLabel() + '.xml'))
destination << prev.getSamplerData().getBytes(StandardCharsets.UTF_8)

destination.close() 

Пробовал добавить таким способом

List<String> filePaths = Arrays.asList("/absolute/path/file1.txt", "/absolute/path/file2.txt");
String zipPath = "/absolute/path/output.zip";

try (ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipPath))) {
    for (String filePath : filePaths) {
        File fileToZip = new File(filePath);
        zipOut.putNextEntry(new ZipEntry(fileToZip.getName()));
        Files.copy(fileToZip.toPath(), zipOut);
    }
}

Но видимо логика не подходит.


Ответы (1 шт):

Автор решения: Dmitri T

Видимо, "логика" не подходит потому что, видимо, логики в ваших действиях нет. Копирование кода из интернета без понимания что этот код делает - не лучший способ освоить язык программирования.

Код нормально работает сам по себе (создание нового архива) если добавить соответствующие импорты:

import java.util.zip.ZipEntry
import java.util.zip.ZipOutputStream
import java.nio.file.Files

Если вы хотите добавить файлы в уже существующий архив - "логика" не будет работать потому что это невозможно на уровне API Java, вам нужно открыть "старый" архив, вытащить оттуда все ZipEntry, добавить новые и либо перезаписать предыдущий файл или сохранить под новым именем. Или использовать сторонние библиотеки типа TrueZip или 7-Zip-JBinding

Проще будет добавить сразу все одним махом в один архив в Groovy

import java.nio.charset.StandardCharsets

def destination = new java.util.zip.ZipOutputStream(new FileOutputStream(new File('request' + ${__Random(100000,200000,)} + '.zip')), StandardCharsets.UTF_8)
destination.putNextEntry(new java.util.zip.ZipEntry(prev.getSampleLabel() + '.xml'))
destination << prev.getSamplerData().getBytes(StandardCharsets.UTF_8)

def files = ['/absolute/path/file1.txt', '/absolute/path/file2.txt']

files.each { filename ->
    def file = new File(filename)
    destination.putNextEntry(new java.util.zip.ZipEntry(file.getName()))
    destination << file.bytes
}


destination.close() 
→ Ссылка