2011-03-30 19 views
12

java.util.zip paketini denedim, çok yavaş.Çok sayıda dosya içeren bir zip dosyasından 1 dosya ayıklamanın en hızlı yolu nedir?

Daha sonra LZMA SDK ve 7z jbinding'u buldum ama aynı zamanda bir şeyleri de yok. LZMA SDK, nasıl kullanılacağı konusunda bir tür dokümantasyon/eğitim sağlamaz, çok sinir bozucu. Javadoc yok.

7z jbinding, yalnızca 1 dosya ayıklamanın basit bir yolunu sağlamaz, ancak, yalnızca zip dosyasının tüm içeriğini ayıklamanın bir yolunu sağlar. Ayrıca, sıkıştırılmamış dosyayı yerleştirmek için bir yer belirtmenin bir yolunu sağlamaz.

Herhangi bir fikir lütfen ???

cevap

15

java.util.zip kodunuz nasıl görünür ve bir zip dosyasının boyutu nedir?

Ben bu konuda kabaca bir saniye içinde 1.800 girişlerle bir 200MB zip dosyası dışında bir 4 MB girişini ayıklamak mümkün değilim:

OutputStream out = new FileOutputStream("your.file"); 
FileInputStream fin = new FileInputStream("your.zip"); 
BufferedInputStream bin = new BufferedInputStream(fin); 
ZipInputStream zin = new ZipInputStream(bin); 
ZipEntry ze = null; 
while ((ze = zin.getNextEntry()) != null) { 
    if (ze.getName().equals("your.file")) { 
     byte[] buffer = new byte[8192]; 
     int len; 
     while ((len = zin.read(buffer)) != -1) { 
      out.write(buffer, 0, len); 
     } 
     out.close(); 
     break; 
    } 
} 
+1

..... biz
Ben ZipFile API daha hızlıdır hayal olur Saniyede 20 istek hakkında konuşuyor. Java.util.zip kullanarak bir dosyayı açmanın hızının 0,5 ila 2 sn arasında olacağını inceledik. Bu yavaş. – lamwaiman1988

+2

Sanırım bir zip dışında tek bir dosyaya ihtiyaç duyulan saniyede 20 istek hakkında konuşuyorsunuz. Neden sadece zamanı önceden unzip değil ve doğrudan dosya sisteminden sunma? FileInputStream ve ZipInputStream arasında bir BufferedInputStream varsa – WhiteFang34

+4

kodunuzu daha hızlı olacaktır. – EJP

6

yerine bir ZipInputStream daha ZipFile kullanın.

Dokümantasyon bunu belirtmese de (JarFile dokümanı içindedir), dosyayı okumak için rasgele erişimli dosya işlemlerini kullanmalıdır. Bir ZIP dosyası, bilinen bir konumda bir dizin içerdiğinden, belirli bir dosyayı bulmak için daha az IO'nun olması gerekir.

Bazı uyarılar: Bilgimden en iyi şekilde, Sun uygulaması bellek eşlemeli bir dosya kullanır. Bu, sanal adres alanınızın, dosyayı ve JVM'nizdeki her şeyi tutmaya yetecek büyüklükte olması gerektiği anlamına gelir. Bir 32-bit sunucu için sorun olabilir. Öte yandan, 32-bit ya da bellek-haritası üzerinde sadece bellek-haritalamayı önlemek için yeterince akıllı olabilir; Denemedim.

Ayrıca, birden fazla dosya kullanıyorsanız, dosyanın kullanımdan sonra kapalı olduğundan emin olmak için bir try/finally kullandığınızdan emin olun.

7

Hızını kıyaslamamışım ancak 7 veya üstü java ile aşağıdaki gibi bir dosya çıkartıyorum.

bir zip dosyası test.zip den META-INF/MANIFEST.MF ayıklanması Kısa bir örnek

: Biz dışarıdan kullanımı için bir web uygulaması yapıyoruz

// file to extract from zip file 
String file = "MANIFEST.MF"; 
// location to extract the file to 
File outputLocation = new File("D:/temp/", file); 
// path to the zip file 
Path zipFile = Paths.get("D:/temp/test.zip"); 

// load zip file as filesystem 
try (FileSystem fileSystem = FileSystems.newFileSystem(zipFile, null)) { 
    // copy file from zip file to output location 
    Path source = fileSystem.getPath("META-INF/" + file); 
    Files.copy(source, outputLocation.toPath()); 
} 
+0

teşekkürler. Bu çalışır :) –

+0

Çalışır, ve yıldırım hızlı ... bu kabul edilmiş bir cevap olmalıdır (Java 7 veya daha yüksek olduğu varsayılarak). – leo

İlgili konular