2008-10-28 22 views
11

java.util.zip.* aracılığıyla bir zip Arşiv oluşturduğumda, ortaya çıkan arşivi birden çok birim halinde bölmenin bir yolu var mı?Büyük bir zip dosyasını birden çok cihaza bölme nasıl?

Genel arşivimin filesize'un 24 MB olduğunu varsayalım ve dosya başına 10 MB sınırında 3 dosyaya bölmek istiyorum.
Bu özelliğe sahip bir zip API var mı? Ya da bunu başarmanın başka herhangi bir yolu?

Teşekkür Thollsten

cevap

7

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

bunu yapmana yardımcı olacak hiçbir API farkında değilim. kullanarak ZippedInput/OutputStream sıkıştırılmış boyutu sahipken (programlama yoluyla bunu yapmak istemiyorsanız, bunu yapacak WinSplitter gibi yardımcı programları olmasına rağmen)

Her ZipEntry, denedim ama değil. Oluştururken sıkıştırılmış dosyanın boyutunun kaba bir tahminini alabilirsiniz. 2MB'lık sıkıştırılmış dosyalara ihtiyacınız varsa, Manifest dosyası ve diğer zip dosyalarına özgü öğeler için .1MB alan kümülatif boyut girişleri 1.9 MB olur. aşağıdaki gibi Yani, kısaca, sen ZippedInputStream sarmalayan yazabilirsiniz:

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

yukarıdaki program sadece yaklaşımın ipucu değil, herhangi bir yöntemle tarafından nihai bir çözümdür.

+1

Bu sadece birkaç ayrı zip dosyası, değil mi? Tek bir multi-volume zipfile değil. – mcv

+0

Bu sorunun cevabında çalışan bu kodu aldık - http://stackoverflow.com/questions/11104889/how-to-create-java-zip-archives-with-a-max-file-size-limit –

5

Amaç, çıkışın pkzip ve winzip ile uyumlu olmasını sağlamaksa, bunu yapan herhangi bir açık kaynak kitaplığından haberdar değilim. Uygulamalarımızdan birine benzer bir gereksinimimiz vardı ve kendi uygulamamızı yazarken (posta standardıyla uyumlu) yaralarım. Hatırlarsam, bizim için en zor olan şey, tek tek dosyaları anında üretmek zorunda olduğumuzdur (en zip araçlarının çalışması, büyük zip dosyasını oluşturmaları, sonra geri dönüp daha sonra bölmeleridir). Yazmak için bir gün ve hata ayıklamak için 2 gün sürdü

Dosya formatının neye benzemesi gerektiğini zip standardı açıklar.Koltuklarınızı biraz döndürmekten korkmazsanız, bu kesinlikle yapılabilir. Kendiniz bir zip dosya jeneratörü uygulamak zorundasınız, ancak sıkıştırılmış veri için segment akışlarını oluşturmak için Java'nın Deflator sınıfını kullanabilirsiniz. Dosya ve bölüm başlıklarını kendiniz oluşturmanız gerekir, ancak bunlar sadece baytlardır - hiçbir şey çok zor değil Bir kez daldığınızda,

İşte zip specification - bölüm K özellikle aradığınız bilgilere sahiptir, ancak A, B, C ve F'yi de okumalısınız. Eğer gerçekten büyük dosyalar ile uğraşıyorsanız (Biz), Zip64 şeylerine de girmelisiniz - ama 24 MB için siz iyisiniz.

Dalış yapmak ve denemek isterseniz - soruları yanıtlıyorsanız, geri gönderin ve bazı işaretçiler sağlayıp sağlayamayacağımı görelim.

+0

I Çok hacimli zip dosyaları ile ilgili sorunlar yaşıyorum. Özellikle tek bir dosya bileşeni diskten daha fazla dosya arasında bölünmüşse. File.zx01 dosyasında dosya üstbilgisi ve sıkıştırılmış verilerin ilk kısmı var, daha sonra file.zx02 dosyasında sıkıştırılmış verilerin geri kalanı var.Ama dosyaları bir sebepten dolayı yeniden kuramıyorum ve neden emin değilim. Burada herhangi bir deneyiminiz var mı? – vy32

İlgili konular