varios varias txt partir partes grandes dividir con comprimir como archivos archivo java zip

java - varias - comprimir zip en varios archivos



¿Cómo dividir un gran archivo comprimido en varios volúmenes? (2)

Cuando creo un archivo zip a través de java.util.zip.* , ¿Hay alguna manera de dividir el archivo resultante en varios volúmenes?

Digamos que mi archivo general tiene un filesize de filesize de 24 MB y quiero dividirlo en 3 archivos con un límite de 10 MB por archivo.
¿Hay una API zip que tenga esta característica? ¿O alguna otra buena manera de lograr esto?

Gracias Thollsten


Compruebe: http://saloon.javaranch.com/cgi-bin/ubb/ultimatebb.cgi?ubb=get_topic&f=38&t=004618

No conozco ninguna API pública que te ayude a hacer eso. (Aunque si no quieres hacerlo programáticamente, hay utilidades como WinSplitter que lo harán)

No lo he intentado, pero cada ZipEntry durante el uso de ZippedInput / OutputStream tiene un tamaño comprimido. Puede obtener una estimación aproximada del tamaño del archivo comprimido al crearlo. Si necesita 2MB de archivos comprimidos, puede dejar de escribir en un archivo después de que el tamaño acumulado de las entradas se convierta en 1.9MB, tomando .1MB para el archivo Manifiesto y otros elementos específicos del archivo zip. Entonces, en pocas palabras, puede escribir un contenedor sobre el ZippedInputStream de la siguiente manera:

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

El programa anterior es solo un indicio del enfoque y no una solución final de ninguna manera .


Si el objetivo es que la salida sea compatible con pkzip y winzip, no conozco ninguna biblioteca de código abierto que haga esto. Tuvimos un requisito similar para una de nuestras aplicaciones, y terminé escribiendo nuestra propia implementación (compatible con el estándar zip). Si recuerdo, lo más difícil para nosotros fue que tuvimos que generar los archivos individuales sobre la marcha (la forma en que funcionan la mayoría de las utilidades zip es que crean el archivo zip grande, luego lo regresan y lo dividen más tarde, es mucho más fácil implementar. Tomó alrededor de un día para escribir y 2 días para la depuración.

El estándar zip explica cómo debe verse el formato de archivo. Si no tienes miedo de arremangarte un poco, esto es definitivamente factible. Usted tiene que implementar un generador de archivos zip usted mismo, pero puede usar la clase Deflator de Java para generar las secuencias de segmento para los datos comprimidos. Tendrás que generar los encabezados del archivo y de la sección por ti mismo, pero son solo bytes, nada demasiado difícil una vez que te sumerjas.

Aquí está la especificación zip : la sección K tiene la información que estás buscando específicamente, pero también necesitarás leer A, B, C y F. Si está tratando con archivos realmente grandes (Nosotros lo éramos), también tendrá que usar Zip64, pero por 24 MB, está bien.

Si quieres bucear y probarlo, si encuentras preguntas, publícalas y veré si puedo proporcionar algunas sugerencias.