2010-08-26 8 views
12

मुझे एक आवश्यकता है जिसमें मुझे उपलब्ध फ़ाइलों की सूची से ज़िप फ़ाइल बनाना है। फाइलें विभिन्न प्रकार के हैं जैसे कि txt, pdf, xml आदि। मैं जावा उपयोग कक्षाओं का उपयोग कर रहा हूं।इसे बनाने से पहले जावा में ज़िप फ़ाइल आकार का आकलन कैसे करें

यहां अधिकतम आवश्यकता 5 एमबी के अधिकतम फ़ाइल आकार को बनाए रखने के लिए है। मुझे टाइमस्टैम्प के आधार पर सूची से फ़ाइलों का चयन करना चाहिए, ज़िप फ़ाइल आकार 5 एमबी तक पहुंचने तक फ़ाइलों को ज़िप में जोड़ें। मुझे शेष फाइलों को छोड़ना चाहिए।

कृपया मुझे बताएं कि जावा में कोई तरीका है, जहां मैं वास्तविक फ़ाइल बनाने के बिना ज़िप फ़ाइल आकार का अनुमान लगा सकता हूं?

या कोई अन्य दृष्टिकोण इस

उत्तर

0

मैं न लगता है कि जिप क्योंकि ज़िप धाराओं के रूप में संसाधित कर रहे हैं बनाया जाएगा कि के आकार का अनुमान किसी भी तरह से है संभाल करने के लिए है। साथ ही जब तक आप इसे वास्तव में संपीड़ित नहीं करते हैं, तब तक बनाए गए संपीड़ित प्रारूप के आकार की भविष्यवाणी करना तकनीकी रूप से संभव नहीं होगा।

8

अपने ZipOutputStream को एक वैयक्तिकृत आउटपुटस्ट्रीम में लपेटें, जिसका नाम यहां आपका आउटपुटस्ट्रीम है।

  • YourOutputStream के निर्माता एक और ZipOutputStream (zos2) पैदा करेगा जो एक नई ByteArrayOutputStream (baos)
    public YourOutputStream(ZipOutputStream zos, int maxSizeInBytes)
  • जब आप YourOutputStream के साथ एक फ़ाइल लिखना चाहते हैं, यह पहली बार यह zos2
    पर लिखेंगे लपेटता public void writeFile(File file) throws ZipFileFullException
    public void writeFile(String path) throws ZipFileFullException
    आदि ...
  • baos.size()किया जा रहा है अगर
    • zos1
  • बाकी
    • पास zos1, baos में फ़ाइल लिखें, zos2 एक फेंक एक अपवाद। अपवाद के लिए, मैं पहले से मौजूद अस्तित्व में नहीं सोच सकता, अगर ऐसा है, तो इसका इस्तेमाल करें, और अपना खुद का IOException ZipFileFullException बनाएं।

आप अगर अपनी सामग्री 5MB खत्म हो गया है की जाँच करने के दो ZipOutputStream, एक अपने ड्राइव पर लिखे जाने की भी।

संपादित करें: असल में मैंने चेक किया, you can't remove a ZipEntry easily

http://download.oracle.com/javase/6/docs/api/java/io/ByteArrayOutputStream.html#size()

+0

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

0

मैं ज्ञात इनपुट प्रकार के साथ एक परियोजना पर एक बार ऐसा किया। हम जानते थे कि आम तौर पर हमारे डेटा को 5: 1 के आसपास संपीड़ित किया जाता है (यह सब पाठ था।) तो, मैं फ़ाइल आकार की जांच करता हूं और 5 से विभाजित करता हूं ...

इस मामले में, ऐसा करने का उद्देश्य था जांचें कि फाइलें निश्चित आकार से नीचे होंगी। हमें केवल एक अनुमानित अनुमान की आवश्यकता है।

सभी ने कहा कि, मैंने देखा है कि ज़िप अनुप्रयोगों जैसे 7zip एक निश्चित आकार (एक सीडी की तरह) की ज़िप फ़ाइल बनायेगा और फिर सीमा तक पहुंचने के बाद ज़िप को एक नई फ़ाइल में विभाजित कर देगा। आप उस स्रोत कोड को देख सकते हैं।मैंने वास्तव में कोड में उस ऐप के कमांड लाइन संस्करण का उपयोग किया है। उनके पास एक पुस्तकालय है जिसका आप उपयोग भी कर सकते हैं। यह सुनिश्चित नहीं है कि जावा के साथ एकीकृत कैसे होगा।

इसके लायक होने के लिए, मैंने SharpZipLib नामक लाइब्रेरी का भी उपयोग किया है। बहुत अच्छा था। मुझे आश्चर्य है कि इसमें जावा पोर्ट है या नहीं।

1

कॉलिन हरबर्ट के लिए +1: फ़ाइलों को एक-एक करके जोड़ें, या तो पिछले चरण का बैक अप लें या अंतिम फ़ाइल को निकालने पर अंतिम फ़ाइल को हटा दें। मैं बस कुछ विवरण जोड़ना चाहता हूं:

भविष्यवाणी बहुत अविश्वसनीय है। ईजी। एक पीडीएफ में असंपीड़ित पाठ हो सकता है, और मूल के 30% तक संकुचित हो सकता है, या इसमें पहले से संपीड़ित पाठ और छवियां शामिल हैं, जो 80% तक संपीड़ित होती हैं। आपको संपीड़न के लिए पूरे पीडीएफ का निरीक्षण करने की आवश्यकता होगी, मूल रूप से उन्हें संपीड़ित करना होगा।

आप एक सांख्यिकीय भविष्यवाणी आज़मा सकते हैं, लेकिन इससे असफल प्रयासों की संख्या कम हो सकती है, लेकिन आपको अभी भी ऊपर की सिफारिश को लागू करना होगा। पहले सरल कार्यान्वयन के साथ जाएं, और देखें कि यह पर्याप्त है या नहीं।

वैकल्पिक रूप से, व्यक्तिगत रूप से फ़ाइलों को संपीड़ित करें, फिर उन फ़ाइलों को चुनें जो एक साथ बंधे हुए 5 एमबी से अधिक नहीं होंगे। यदि अनपॅकिंग स्वचालित है, तो भी, आप ज़िप फ़ाइलों को एक असम्पीडित ज़िप फ़ाइल में बाध्य कर सकते हैं।

+0

यदि वास्तव में यह वास्तव में काम नहीं करेगा, तो आपके पास केवल 5 एमबी से अधिक फ़ाइल हो सकती है जिसमें "aaaa ..." यह ज़िप में फिट करने के लिए पर्याप्त संपीड़ित होगा। –

+0

डी ओह। क्या मैं जल्दी सुबह-मूर्खता का दावा कर सकता हूं? – peterchen

+0

(निश्चित रूप से निश्चित) – peterchen

1

हो सकता है कि आप प्रत्येक बार एक फ़ाइल जोड़ सकें, जब तक कि आप 5 एमबी सीमा तक नहीं पहुंच जाते, और फिर अंतिम फ़ाइल को छोड़ दें। @ गोपी की तरह, मुझे नहीं लगता कि फ़ाइल को वास्तव में संपीड़ित किए बिना इसका अनुमान लगाने का कोई तरीका है।

बेशक, फ़ाइल आकार में वृद्धि नहीं होगी (या शायद ज़िप हेडर की वजह से थोड़ा सा?), इसलिए कम से कम आपके पास "सबसे खराब मामला" अनुमान है।

+0

http://zlib.net/zlib_tech.html पर "अधिकतम विस्तार कारक" देखें – snemarch

0

बस साझा करने के लिए कैसे हम मैनुअल तरीका

  int maxSizeForAllFiles = 70000; // Read from property 
     int sizePerFile = 22000; // Red from property 
     /** 
     * Iterate all attachment list to verify if ZIP is required 
     */ 
     for (String attachFile : inputAttachmentList) { 
      File file = new File(attachFile); 
      totalFileSize += file.length(); 
      /** 
      * if ZIP required ??? based on the size 
      */ 
      if (file.length() >= sizePerFile) { 
       toBeZipped = true; 
       logger.info("File: " 
          + attachFile 
           + " Size: " 
           + file.length() 
           + " File required to be zipped, MAX allowed per file: " 
           + sizePerFile); 
       break; 
      } 
     } 
     /** 
     * Check if all attachments put together cross MAX_SIZE_FOR_ALL_FILES 
     */ 
     if (totalFileSize >= maxSizeForAllFiles) { 
      toBeZipped = true; 
     } 
     if (toBeZipped) { 
      // Zip Here iterating all attachments 
     } 
0

वहाँ एक बेहतर विकल्प है कार्यान्वित करना चाहता था। एक डमी LengthOutputStream कि सिर्फ लिखित बाइट्स में गिना जाता है बनाएँ:

public class LengthOutputStream extends OutputStream { 

    private long length = 0L; 

    @Override 
    public void write(int b) throws IOException { 
     length++; 
    } 

    public long getLength() { 
     return length; 
    } 
} 

तुम बस बस कनेक्ट कर सकते हैं LengthOutputStream एक ZipOutputStream रहे हैं:

public static long sizeOfZippedDirectory(File dir) throws FileNotFoundException, IOException { 
     try (LengthOutputStream sos = new LengthOutputStream(); 
      ZipOutputStream zos = new ZipOutputStream(sos);) { 
      ... // Add ZIP entries to the stream 
      return sos.getLength(); 
     } 
    } 

LengthOutputStream वस्तु ज़िपित धारा लेकिन भंडार कुछ भी नहीं के बाइट्स में गिना जाता है, इसलिए कोई फ़ाइल आकार सीमा नहीं है। यह विधि सटीक आकार अनुमान देती है लेकिन लगभग ज़िप फ़ाइल बनाने के रूप में धीमी है।

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