У меня есть ZipInputStream. Я хочу распаковать содержимое, а затем повторно сжать его в файл tar.gz. Как это сделать в java? - PullRequest
0 голосов
/ 28 мая 2020

Я сейчас пытаюсь это кодировать. Я выполнил базовую c обработку, чтобы переименовать содержимое файлов в заархивированном файле.

String archiveDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
        File archivingDir = new File(CommClientConstants.SFMC_ARCHIVE_DIR + archiveDate + "/");
        OutputStream os = new BufferedOutputStream(new FileOutputStream(archivingDir + "/" +  fileName.split("\\.")[0]+".tar"));

        try (ArchiveOutputStream aos = new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.ZIP, os)) {
            for (String zippedFile : new ArrayList<>(renamedNonManifestFiles.keySet())) {
                File archiveFile = new File(zippedFile);
                ArchiveEntry entry = aos.createArchiveEntry(archiveFile, archiveFile.getName());
                aos.putArchiveEntry(entry);

                    try (InputStream i = new ByteArrayInputStream(renamedNonManifestFiles.get(zippedFile).getBytes())){
                        IOUtils.copy(i, aos);
                }
                    catch (IOException ioe){
                        //System.out.println("SIZE IS: " + entry.getSize());
                        ioe.printStackTrace();
                    }
            }
            aos.closeArchiveEntry();
            aos.finish();
        }

Это в настоящее время меняет имя, которое я хочу, но записывает только сжатый файл как файл .zip.

Я попытался изменить ArchiveOutputStream aos = new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.ZIP, os) на ArchiveOutputStream aos = new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.TAR, os), и я попытался изменить OutputStream os = new BufferedOutputStream(new FileOutputStream(archivingDir + "/" + fileName.split("\\.")[0]+".tar")); на TarArchiveOutputStream os = new TarArchiveOutputStream(new FileOutputStream(archivingDir + "/" + fileName.split("\\.")[0]+".tar"));, но эти изменения приводят только к исключениям, связанным с tar, когда компилятор жалуется на «размер заголовка '0' или отсутствие тока Запись tar.

Я знаю, что кое-что не понимаю. Нужно ли мне полностью распаковать .zip и записать его на диск, а затем каким-то образом преобразовать его в файл tar? Я бы хотел выполнять все эти операции в потоках и писать на диск как можно меньше, только когда я буду готов сжать архив и записать его.

Как я могу это сделать? Любое понимание приветствуется

...