2011-06-03 12 views
5

के माध्यम से ज़िफाइल का स्ट्रीम सामग्री मेरे पास काफी मात्रा में स्ट्रीम करने योग्य डेटा (> 100 एमबी) है, जो संपीड़न के लिए, मैं एक http-server पर एक ज़िपफाइल में पैक होस्ट करना चाहता हूं। तो इस ज़िपफाइल में एक फ़ाइल है।जावा: HTTP

क्या जावा-क्लाइंट के लिए http के माध्यम से डेटा स्ट्रीम करना संभव है, भले ही यह एक ज़िपफाइल में पैक किया गया हो?

विकिपीडिया के अनुसार, ज़िप क्रमिक रूप से नहीं कर रहे हैं ...

http://en.wikipedia.org/wiki/ZIP_(file_format)#Structure

यदि इससे भी किसी भी तरह संभव है, तो कैसे?

संपादित करें: gzip के बारे में: जैसा कि मैंने कहा था, मैं एक जावा जावा क्लाइंट (वेबब्रोसर नहीं) का उपयोग जावा http कार्यान्वयन में gzip उपलब्ध है?

+0

आप ' ज़िप फ़ाइल के अंदर फ़ाइलों को स्ट्रीम करने के बारे में बात कर रहे हैं, पूरी ज़िप फ़ाइल सही नहीं है? – Alvin

+0

अच्छी तरह से वास्तव में ज़िपफाइल में केवल एक फ़ाइल है। और यह वह है जिसे मैं स्ट्रीम करना चाहता हूं। – clamp

उत्तर

4

जावा gzipGZipInputStream (डीकंप्रेसिंग) और GZipOutputStream (संपीड़न) के साथ प्रारूप का समर्थन करता है। zip और gzip आंतरिक रूप से समान संपीड़न प्रारूप का उपयोग करते हैं, मुख्य अंतर मेटाडाटा में है: zip में फ़ाइल के अंत में, gzip शुरुआत में है (और gzip केवल एक संलग्न फ़ाइल का समर्थन करता है)।

gzip का उपयोग करके एक बड़ी फ़ाइल स्ट्रीमिंग के लिए, बेहतर काम करने के लिए बेहतर होगा - और भी आपको मेटाडेटा तक पहुंच की आवश्यकता नहीं है।

मुझे यकीन है कि HTTPConnection Accept-Encoding: gzip भेजता है और फिर स्वचालित रूप से सामग्री बढ़ा-चढ़ाकर यदि सर्वर Content-Encoding: gzip साथ यह बचाता है संभालती है, तो नहीं कर रहा हूँ, लेकिन आप निश्चित रूप से इसे मैन्युअल रूप से कर सकते हैं सर्वर बस जैसे एक .gz फ़ाइल भेजता है (यानी के साथ Content-Encoding: identity)।

(वैसे, के रूप में प्रत्येक Deflate कॉल के बाद से जावा के GZipInputStream देशी zlib कार्यान्वयन का उपयोग करता, एक देशी कॉल भूमि के ऊपर होगा, बहुत छोटा नहीं बफ़र्स साथ स्ट्रीम से पढ़ने का सुनिश्चित करें।)

2

हाँ तुम, ज़िप स्ट्रीम करें और के रूप में आवेदन/ज़िप

MIME प्रकार का उपयोग आप वास्तव में, दूसरे छोर पर धारा संगीत खेलना चाहते हैं तो यह तुच्छता के रूप में आप कर सकते हैं नहीं किया जा सकता कर सकते हैं क्लाइंट पर पूरा ज़िप उपलब्ध होने के बाद ही अनपैक करें।

तो आकार आप चिंता का विषय है, तो आप इस तरह के ogg/वॉर्बिस

+0

क्या आप निश्चित हैं, क्योंकि यह छवि कहती है कि यह स्ट्रीम करने योग्य नहीं है: http://en.wikipedia.org/wiki/File:ZIPformat.jpg – clamp

+1

@clamp: आप इसे स्ट्रीम कर सकते हैं, लेकिन जब तक आप प्राप्त नहीं करते हैं तब तक आप इसे अनपैक नहीं कर सकते ग्राहक पक्ष पर फ़ाइल की पूरी सामग्री। (यही वह छवि है जो लेख/आलेख वर्णन कर रहा है) – sarumont

+0

@sarumont +1 दाएं –

4

इसे और अधिक फ़ायदेमंद होगा जाने के लिए के रूप में अपने एमपी 3 बिट दर या उपयोग प्रारूपों नीचे बंद कर सकते हैं या तो है वेब सर्वर ज़िप करना है? आप बस इस्तेमाल किया जा रहा है, बल्कि वास्तव में सर्वर पर ज़िप किया गया फ़ाइल की दुकान के लिए इच्छुक से बैंडविड्थ की मात्रा को कम करने की कोशिश कर रहे हैं, तो यह केवल विन्यास की बात हो सकता है, उदाहरण के लिए देखें:

http://tomcat.apache.org/tomcat-5.5-doc/config/http.html

HTTP/1.1 जीजेआईपी संपीड़न के लिए। सर्वर ज़िप्ड होने के लिए ग्राहक को प्रतिक्रिया को मजबूर कर सकता है।

http://en.wikipedia.org/wiki/HTTP_compression भी देखें।

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

static void processZippedInputStream(InputStream in, String entryNameRegex) 
throws IOException 
{ 
    ZipInputStream zin = new ZipInputStream(in); 
    ZipEntry ze; 
    while ((ze = zin.getNextEntry()) != null) 
    { 
     if (ze.getName().matches(entryNameRegex)) 
     { 
      // treat zin as a normal input stream - ie read() from it till "empty" etc 
      break; 
     } 
     zin.closeEntry(); 
    } 
    zin.close(); 
} 

एक सामान्य InputStream के साथ मुख्य अंतर प्रविष्टियों के माध्यम से पुनरावृत्ति है:

+0

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

+0

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

+0

@ सूरज अगर अलग-अलग हिस्सों को ज़िपित किया जाता है, तो नहीं, आपको समस्या नहीं है। लेकिन यह सच है कि आपको यह जांचने की ज़रूरत है कि क्या होता है यदि आपने ट्रांसफर-एन्कोडिंग का उपयोग GZIP संपीड़न के साथ एक साथ किया था। संभावित रूप से, आपको केवल चंक किए गए स्थानांतरण एन्कोडिंग का उपयोग करने की आवश्यकता है, और अपने आप को चिपकाएं और उन्हें क्लाइंट पर अनजिप करें, जो गन्दा है! मैं वास्तव में यह नहीं जानता कि यह कोशिश किए बिना यह कैसे काम करता है, लेकिन मुझे लगता है कि अलग-अलग हिस्सों को gzipped किया जाएगा। अगर कोई इसे कोशिश करता है, तो मुझे बताएं! –

5

यहाँ कोड का एक टुकड़ा (जो काम करता है) कि ग्राहक ज़िपित स्ट्रीम से पढ़ने का उपयोग कर सकते हैं। उदाहरण के लिए, आप जानते हैं कि आप पहली प्रविष्टि चाहते हैं, इसलिए नाम मिलान पैरामीटर आदि के लिए कोई आवश्यकता नहीं है

+0

जैसा कि मैंने कहा था, ज़िपफाइल में केवल एक ही प्रविष्टि होगी। असल में ऐसा लगता है कि इसके बारे में मेटाफॉर्मेशन ज़िफाइल के बहुत अंत में है, इसलिए मुझे पूरी फाइल को डाउनलोड करने की आवश्यकता होगी इससे पहले कि मैं अनजिप करना शुरू कर सकूं, है ना? – clamp

+0

नहीं - प्रविष्टियों का नाम तब सामग्री से सामना किया जाता है, इसलिए आपको प्रवेश शीर्षलेख सीधे – Bohemian

0

जीजेआईपी का उपयोग करें और फिर आप स्ट्रीम कर सकते हैं। Gzip किसी भी तरह से ज़िप के डिफ़ॉल्ट संपीड़न एल्गोरिदम का उपयोग करता है।

+0

धन्यवाद मिलेगा, लेकिन क्या यह gzip जावा http कार्यान्वयन में उपलब्ध है? – clamp

+0

सुनिश्चित करें कि बस एक gzipstream भेजें और सर्वर की तरफ स्ट्रीम को डिस्क पर संग्रहीत करें। आप बस वर्तमान धाराओं को लपेटें। Gzipstream पोस्ट या पुट के अंदर संलग्न इकाई है – MJB