Сжатие файлов до фиксированного размера в Java - PullRequest
3 голосов
/ 26 октября 2019

Я хочу выполнить сжатие файлов, используя пакет zip из библиотеки java.util. Цель состоит в том, чтобы ограничить сжатый файл фиксированным размером. Если размер сжатого файла превышает этот предел, его следует разбить на несколько файлов.

try {
            fos = new FileOutputStream(p_request.getOutputFilePath() + zipFileName);
            ZipOutputStream zos = new ZipOutputStream(fos);
            zipEntry1 = new ZipEntry(f.getName());
            fis = new FileInputStream(f.getAbsolutePath());
            int count;
            while ((count = fis.read(fileRAW, 0, BUFFER)) != -1) {
              zipEntry1 = new ZipEntry(f.getName());
              if (currentSize >= (p_request.getMaxSizePerFileInMB() * 1024 * 1024)) {
                zipSplitCount++;
                zos.close();
                zos = new ZipOutputStream(new FileOutputStream(
                    p_request.getOutputFilePath() + zipFileName
                        + "_" + zipSplitCount + ".zip"));
                currentSize = 0;
              }
              zos.putNextEntry(zipEntry1);
//              zos.closeEntry();
              currentSize += zipEntry1.getCompressedSize();
              zos.write(fileRAW, 0, count);
            }

Я всегда получаю сжатый размер как -1. Может кто-нибудь посоветовать чистый подход для этого?

РЕДАКТИРОВАТЬ:

Поэтому я сжал файл в куски фиксированного размера, чтобы получить сжатый zip-файл из нескольких частей того же файла, что и f.1.zip,f.2.zip. Теперь, когда я распаковываю его, есть ли способ восстановить исходный файл? В настоящее время он говорит, что файл должен быть поврежден.

byte[] buffer = new byte[BUFFER];
        ZipInputStream zis = null;
        try {
          zis = new ZipInputStream(new FileInputStream(f.getAbsolutePath()));
          ZipEntry zipEntry = zis.getNextEntry();

          while(zipEntry!=null){

            String fileName = zipEntry.getName();
            File newFile = new File(p_request.getOutputFilePath() + fileName);

            System.out.println("file unzip : "+ newFile.getAbsoluteFile());

            new File(newFile.getParent()).mkdirs();

            FileOutputStream fos = new FileOutputStream(newFile);

            int len;
            while ((len = zis.read(buffer)) > 0) {
              fos.write(buffer, 0, len);
            }

            fos.close();
            zipEntry = zis.getNextEntry();
          }

          zis.closeEntry();
          zis.close();

1 Ответ

1 голос
/ 26 октября 2019

Вы получаете -1, потому что размер неизвестен, пока файл Zip не будет записан на диск. Сжатие происходит при сохранении всего zip-файла, а не при добавлении новой записи.

Это означает, что вам необходимо:

  • записать zip-диск после добавления каждогофайла, а затем измерить zip, чтобы определить, нужно ли добавлять к нему или создавать новый файл
  • или предположить размер, основанный на средней степени сжатия и размере файла до сжатия надиск.
...