Как разделить огромный zip-файл на несколько объемов?

Вы выполняете итерацию с 0 по array.length-1. Таким образом, вы должны заменить:

i <= results.length;

на:

i < results.length;
12
задан Reddy 25 October 2012 в 11:00
поделиться

2 ответа

Проверка: http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=38&t=004618

Я не знаю ни о каком общедоступном API, который поможет Вам сделать это. (Хотя, если Вы не хотите делать это программно, существуют утилиты как WinSplitter, который сделает это),

Я не попробовал его, но, каждый ZipEntry, в то время как использование ZippedInput/OutputStream имеет сжатый размер. Можно получить грубую оценку размера заархивированного файла при создании его. Если Вам нужны 2 МБ заархивированных файлов, то можно прекратить писать в файл после того, как кумулятивный размер записей становится 1.9 МБ, беря.1MB для Файла манифеста и другого zip-файла определенные элементы. Так, короче говоря можно записать обертку по ZippedInputStream следующим образом:

import java.util.zip.ZipOutputStream;
import java.util.zip.ZipEntry;
import java.io.FileOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

public class ChunkedZippedOutputStream {

    private ZipOutputStream zipOutputStream;

    private String path;
    private String name;

    private long currentSize;
    private int currentChunkIndex;
    private final long MAX_FILE_SIZE = 16000000; // Whatever size you want
    private final String PART_POSTFIX = ".part.";
    private final String FILE_EXTENSION = ".zip";

    public ChunkedZippedOutputStream(String path, String name) throws FileNotFoundException {
        this.path = path;
        this.name = name;
        constructNewStream();
    }

    public void addEntry(ZipEntry entry) throws IOException {
        long entrySize = entry.getCompressedSize();
        if((currentSize + entrySize) > MAX_FILE_SIZE) {
            closeStream();
            constructNewStream();
        } else {
            currentSize += entrySize;
            zipOutputStream.putNextEntry(entry);
        }
    }

    private void closeStream() throws IOException {
        zipOutputStream.close();
    }

    private void constructNewStream() throws FileNotFoundException {
        zipOutputStream = new ZipOutputStream(new FileOutputStream(new File(path, constructCurrentPartName())));
        currentChunkIndex++;
        currentSize = 0;
    }

    private String constructCurrentPartName() {
        // This will give names is the form of <file_name>.part.0.zip, <file_name>.part.1.zip, etc.
        StringBuilder partNameBuilder = new StringBuilder(name);
        partNameBuilder.append(PART_POSTFIX);
        partNameBuilder.append(currentChunkIndex);
        partNameBuilder.append(FILE_EXTENSION);
        return partNameBuilder.toString();
    }
}

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

8
ответ дан 2 December 2019 в 21:24
поделиться

Если цель состоит в том, чтобы иметь вывод, совместимы с pkzip и winzip, я не знаю ни о каких библиотеках с открытым исходным кодом, которые делают это. У нас было подобное требование для одного из наших приложений, и я волновал запись нашей собственной реализации (совместимый со стандартом zip). Если я вспоминаю, самая твердая вещь для нас состояла в том, что мы должны были генерировать отдельные файлы на лету (способ, которым большая часть работы утилит zip, они создают большой zip-файл, то возвратитесь и разделите его позже - это намного легче реализовать. Занял приблизительно день для записи и 2 дня для отладки.

Стандарт zip объясняет, на что должен быть похожим формат файла. Если Вы не боитесь закатывания рукава немного, это определенно выполнимо. Действительно необходимо реализовать генератор zip-файла сами, но можно использовать класс Дефлятора Java для генерации потоков сегмента для сжатых данных. Необходимо будет генерировать файл и заголовки раздела сами, но они - просто байты - ничто слишком трудно, после того как Вы погружаетесь в.

Вот спецификация zip - раздел K имеет информацию, которую Вы ищете а именно, но необходимо будет считать A, B, C и F также. Если Вы имеете дело с действительно большими файлами (Мы были), необходимо будет войти в материал Zip64 также - но для 24 МБ, Вы в порядке.

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

5
ответ дан 2 December 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: