2011-03-30 14 views
12

मैंने java.util.zip पैकेज की कोशिश की, यह बहुत धीमी है।एक ज़िप फ़ाइल से 1 फ़ाइल निकालने का सबसे तेज़ तरीका क्या है जिसमें बहुत सारी फ़ाइल है?

तब मुझे LZMA SDK और 7z jbinding मिला लेकिन उनमें कुछ कमी भी है। एलजेएमएमए एसडीके कैसे उपयोग करने के लिए एक प्रकार का दस्तावेज/ट्यूटोरियल प्रदान नहीं करता है, यह बहुत निराशाजनक है। कोई जवाडोक नहीं

जबकि 7z jbinding केवल 1 फ़ाइल निकालने का एक आसान तरीका प्रदान नहीं करता है, हालांकि, यह केवल ज़िप फ़ाइल की सभी सामग्री निकालने का तरीका प्रदान करता है। इसके अलावा, यह unzipped फ़ाइल को रखने के लिए एक स्थान निर्दिष्ट करने का एक तरीका प्रदान नहीं करता है।

कोई विचार कृपया ???

उत्तर

15

java.util.zip के साथ आपका कोड कैसा दिखता है और आप किस ज़िप फ़ाइल से निपट रहे हैं?

मैं एक 4MB प्रविष्टि इस के साथ मोटे तौर पर एक दूसरे में 1800 प्रविष्टियों के साथ एक 200MB ज़िप फ़ाइल से बाहर निकालने में सक्षम हूँ:

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

हम बाहरी व्यक्ति के उपयोग के लिए एक वेब अनुप्रयोग कर रहे हैं ..... हम कर रहे हैं प्रति सेकंड 20 अनुरोध के बारे में बात करते हैं। हमने जांच की है कि java.util.zip का उपयोग कर फ़ाइल को अनजिप करने की गति 0.5 से 2 के बीच होगी। यह धीमा है। – lamwaiman1988

+2

मुझे लगता है कि आप प्रति सेकंड 20 अनुरोधों के बारे में बात कर रहे हैं जिन्हें एक ज़िप से बाहर एक फ़ाइल की आवश्यकता है। क्यों न केवल उन समय को पूरी तरह से अनजिप करें और उन्हें सीधे फाइल सिस्टम से सेवा दें? – WhiteFang34

+4

यदि आपके पास FileInputStream और ZipInputStream के बीच BufferedInputStream था तो आपका कोड तेज़ होगा। – EJP

6

एक ZipFile का उपयोग करें बल्कि एक ZipInputStream से।

हालांकि दस्तावेज़ीकरण यह इंगित नहीं करता है (यह JarFile के लिए दस्तावेज़ों में है), फ़ाइल को पढ़ने के लिए इसे यादृच्छिक-पहुंच फ़ाइल संचालन का उपयोग करना चाहिए। चूंकि एक ज़िपफाइल में एक ज्ञात स्थान पर एक निर्देशिका होती है, इसका मतलब है कि एक विशेष फ़ाइल खोजने के लिए बहुत कम आईओ होना होता है।

कुछ चेतावनी: मेरे ज्ञान का सबसे अच्छा, सूर्य कार्यान्वयन मेमोरी-मैप की गई फ़ाइल का उपयोग करता है। इसका अर्थ यह है कि आपकी वर्चुअल एड्रेस स्पेस फ़ाइल को पकड़ने के लिए पर्याप्त है और साथ ही आपके जेवीएम में बाकी सब कुछ भी है। जो 32-बिट सर्वर के लिए एक समस्या हो सकती है। दूसरी तरफ, 32-बिट पर मेमोरी-मैपिंग से बचने के लिए पर्याप्त स्मार्ट हो सकता है, या मेमोरी-मैप सिर्फ निर्देशिका; मैंने कोशिश नहीं की है।

इसके अलावा, यदि आप एकाधिक फ़ाइलों का उपयोग कर रहे हैं, तो सुनिश्चित करने के लिए कि फ़ाइल बंद होने के बाद try/finally का उपयोग करना सुनिश्चित करें।

7

मैंने गति को बेंचमार्क नहीं किया है, लेकिन जावा 7 या इससे अधिक के साथ, मैं निम्नानुसार एक फ़ाइल निकालता हूं।
मैं कल्पना कर सकते हैं कि यह ZipFile एपीआई की तुलना में तेजी है:

एक छोटी उदाहरण एक ज़िप फ़ाइल test.zip से META-INF/MANIFEST.MF निकालने:

// 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

धन्यवाद। यह काम करता है :) –

+0

काम करता है, और बिजली तेजी से ... यह स्वीकार्य उत्तर होना चाहिए (जावा 7 या उच्चतर मानना)। – leo

संबंधित मुद्दे