डिफ्लैटरआउटपुटस्ट के डिफ्लेट () का उपयोग कब करें?

Dec 23 2020

मैं यह जानने की कोशिश कर रहा हूं कि मेरे शीतकालीन अवकाश के दौरान समय को नष्ट करने के लिए डिफ्लैटरआउटपुटस्ट का उपयोग कैसे किया जाए। मैं उलझन में हूं क्योंकि जब मैं दस्तावेज देखता हूं,https://docs.oracle.com/javase/7/docs/api/java/util/zip/DeflaterOutputStream.html, यह कहता है कि डिफ्लेट () का उपयोग आउटपुट डेटा को संपीड़ित करने के लिए किया जाता है, जबकि लिखना () डिफ्लैटरआउटपुटस्ट्रीम (कंप्रेस्ड आउटपुटस्ट्रीम) पर डेटा को संपीड़ित करने के लिए लिखना है।

हालांकि, मैं इंटरनेट पर नमूना कोड देख रहा हूं, लेकिन कोई भी डिफ्लेट () का उपयोग नहीं करता है। मैंने अभी तक देखे गए सभी कोड केवल डिफ्लैट के बिना डिफ्लैटरआउटपुटस्ट्रीम में () लिखे।https://stackoverflow.com/a/13060441/12181863
https://www.programcreek.com/java-api-examples/?api=java.util.zip.DeflaterOutputStream

मैंने देखा कि कोड एक फाइलआउटपुटस्ट को डिफ्लैटरआउटस्ट्रीम के अंदर डालता है, लेकिन यह कैसे इंटरैक्ट करता है? जब डेटा को डिफ्लैटआउटपुटस्ट्रीम में लिखा जाता है, तो क्या यह फ़ाइल डेटा के लिए संपीड़ित डेटा भेजने के लिए स्वचालित रूप से डिफ्लेट () कहता है?

जवाब

3 rzwitserloot Dec 23 2020 at 21:21

यह protected: यह उस स्ट्रीम को उपवर्गित करने के लिए कुछ भी करने के लिए अभिप्रेत है, और आप इसे उप-वर्ग नहीं कर रहे हैं, इसलिए जहां तक ​​आप चिंतित हैं, यह एक कार्यान्वयन विवरण है जिसे आप अपने तर्क में शामिल नहीं कर सकते हैं और जो आपके लिए आह्वान करने के लिए नहीं है।

जब तक, ज़ाहिर है, आप इसे उप-वर्ग करते हैं।

जो आप कर सकते थे - यह एलजेड-आधारित संपीड़न धाराओं के निर्माण के लिए एक टूलकिट की तरह है। यही कारण है कि दोनों GZipOutputStream और ZipOutputStream इसे विस्तारित करते हैं: वे अलग-अलग कंटेनर हैं जो कम से कम एक ही संपीड़न तकनीक का उपयोग करते हैं। और वे ऐसा करते हैं deflate। जब तक आप अपने एलजेड-आधारित संपीड़न प्रणाली को विकसित नहीं कर रहे हैं या किसी मौजूदा, गैर-ज़िप, गैर-जीजी, गैर-डिफाल्टर आधारित संपीड़न प्रारूप के लिए एक पाठक को लागू कर रहे हैं, यह आपके लिए नहीं है।

इस प्रकार के आउटपुटस्ट्रीम को 'फिल्टरस्ट्रीम' कहा जाता है: वे स्वयं किसी भी संसाधन का प्रतिनिधित्व नहीं करते हैं, वे एक के आसपास एक लपेटते हैं। वे किसी भी OutputStream(या किसी भी ) के चारों ओर लपेट सकते हैं InputStream, अवधारणा 'बोलने के लिए दोनों तरफ' पर काम करती है), और पारगमन में बाइट्स को संशोधित करती है।

var out = new DeflaterOutputStream(whatever)एक नया डीफ़्लैटर स्ट्रीम बनाता है जो आपके द्वारा भेजे गए (के माध्यम से out.write(stuff)) किसी भी डेटा को संपीड़ित करेगा , और यह बदले में संपीड़ित डेटा को ले जाएगा और इसे जो भी भेजेगा। यह काम करता है:

  1. बाइट्स (प्रति के अनुसार out.write), बफर को जितना काम करने के लिए आवश्यक है:
  2. ... इस डेटा को संपीड़ित करना।
  3. फिर संपीड़ित डेटा को संसाधित करें, क्योंकि यह संकुचित हो जाता है, इसे लिपटे आउटपुटस्ट्रीम में भेजकर ( whateverइस उदाहरण में), इसकी writeविधि को कॉल करके ।

मूल उपयोग है:

  1. एक संसाधन बनाएं, जैसे कि Files.newOutputStreamया someSocket.getOutputStreamया httpServletResponse.getOutputStream()या System.outकुछ और जो एक स्ट्रीम का उत्पादन करता है - यह एक कारण के लिए एक अमूर्त अवधारणा है: चीजों को लचीला बनाने के लिए।
  2. उस संसाधन को एक में लपेटें DeflaterOutputStream
  3. अपने सभी डेटा को डिफाल्टरआउटस्ट्रीम पर लिखें। मूल के बारे में भूल जाओ - आपने इसे बनाया ताकि आप इसे DeflaterOutputStream में पास कर सकें, और यही वह जगह है जहाँ अंतर्निहित धारा के साथ आपकी बातचीत समाप्त होती है।
  4. डिफ्लेटरस्ट्रीम को बंद करें (जो अंत में अंतर्निहित धारा को भी बंद कर देगा)।