2010-06-26 15 views
10

को देखते हुएरिमोट आर्काइव फ़ाइल से एक फ़ाइल निकालने के लिए कैसे?

  1. एक संग्रह का URL (जैसे एक ज़िप फ़ाइल)
  2. पूरा नाम (पथ सहित) है कि संग्रह के अंदर एक फ़ाइल के

मैं एक तरह से तलाश कर रहा हूँ (अधिमानतः में जावा) उस फ़ाइल की स्थानीय प्रतिलिपि बनाने के लिए, पूरे संग्रह को पहले बिना डाउनलोड किए

से मेरी (सीमित) को समझने हालांकि मुझे पता नहीं कैसे यह है कि क्या करना है यह संभव होना चाहिए,। मैं TrueZip का उपयोग कर रहा हूं, क्योंकि ऐसा लगता है कि यह विभिन्न प्रकार के संग्रह प्रकारों का समर्थन करता है, लेकिन मुझे इस तरह से काम करने की क्षमता के बारे में संदेह है। क्या किसी को इस तरह की चीज़ के साथ कोई अनुभव है?

संपादित करें: टैरबॉल और ज़िप्ड टैरबॉल के साथ ऐसा करने में भी सक्षम होना मेरे लिए भी महत्वपूर्ण है।

उत्तर

8

ठीक है, कम से कम, आप करने के लिए संग्रह ऊपर के भाग को और फ़ाइल आप निकालना चाहते हैं की संकुचित डेटा सहित डाउनलोड करने के लिए किया है। यह निम्न समाधान का सुझाव देता है: संग्रह में URLConnection खोलें, इसकी इनपुट स्ट्रीम प्राप्त करें, इसे ZipInputStream में लपेटें, और फ़ाइल में सभी प्रविष्टियों के माध्यम से फिर से दर्ज करने के लिए getNextEntry() और closeEntry() पर कॉल करें। फिर आप ZipInputStream.read(...) का उपयोग करके अपना डेटा पढ़ सकते हैं।

जावा कोड कुछ इस तरह दिखेगा:

URL url = new URL("http://example.com/path/to/archive"); 
ZipInputStream zin = new ZipInputStream(url.getInputStream()); 
ZipEntry ze = zin.getNextEntry(); 
while (!ze.getName().equals(pathToFile)) { 
    zin.closeEntry(); // not sure whether this is necessary 
    ze = zin.getNextEntry(); 
} 
byte[] bytes = new byte[ze.getSize()]; 
zin.read(bytes); 

यह वह जगह है, ज़ाहिर है, अपरीक्षित।

+0

धन्यवाद; ऐसा लगता है कि यह अच्छी तरह से काम करता है (बार मामूली त्रुटियां), हालांकि दुर्भाग्यवश यह ज़िप संग्रहों के अलावा कुछ भी संभाल नहीं सकता है। – Oak

+3

वैसे हाँ, आपको ऐसा क्यों लगता है कि इसे 'ज़िप इनपुट स्ट्रीम' कहा जाता है? ;-) यदि आप इंटरनेट के चारों ओर देखते हैं तो आप 'TarInputStream' ढूंढ सकते हैं जिसे आप मोटे तौर पर उसी तरह उपयोग कर सकते हैं - या यदि नहीं, तो आप अपना खुद का लिख ​​सकते हैं। यह आसान होगा क्योंकि टैर फाइलें संपीड़ित नहीं होती हैं, यह मूल रूप से फाइल डेटा के बाद प्रत्येक फ़ाइल के लिए एक शीर्षलेख है। (विकिपीडिया में प्रारूप का विवरण है) gzipped tar archives के लिए, जावा की मानक लाइब्रेरी में 'GZIPInputStream' है जिसे आप टैर स्ट्रीम के साथ उपयोग कर सकते हैं। –

+0

वास्तव में, अपाचे में एक [TarInputStream] है (http://javadoc.haefelinger.it/org.apache.ant/1.7.1/org/apache/tools/tar/TarInputStream.html) कक्षा :) – Oak

0

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

public class GetFileFromZIPServlet extends HttpServlet{ 
    @Override 
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException{ 
    String pathToFile = request.getParameter("pathToFile"); 

    byte fileBytes[]; 
    //get the bytes of the file from the ZIP 

    //set the appropriate content type, maybe based on the file extension 
    response.setContentType("..."); 

    //write file to the response 
    response.getOutputStream().write(fileBytes); 
    } 
} 
+0

दुर्भाग्य से, मैं फाइलों को होस्ट करने वाला नहीं हूं ... लेकिन यह एक अच्छा मुद्दा है। – Oak

5

अन्य उत्तर के विपरीत, मैं था यह इंगित करना कि ज़िप प्रविष्टियां अलग-अलग संपीड़ित होती हैं, इसलिए (सिद्धांत में) आपको निर्देशिका और प्रविष्टि से कुछ भी डाउनलोड करने की आवश्यकता नहीं है। काम करने के लिए सर्वर को Range HTTP शीर्षलेख का समर्थन करने की आवश्यकता होगी।

मानक जावा एपीआई केवल स्थानीय फ़ाइलों और इनपुट धाराओं से ज़िप फ़ाइलें पढ़ने का समर्थन करता है। जहां तक ​​मुझे पता है कि यादृच्छिक अभिगम दूरस्थ फ़ाइलों से पढ़ने के लिए कोई प्रावधान नहीं है।

चूंकि आप TrueZip का उपयोग कर रहे हैं, इसलिए मैं अपाचे HTTP क्लाइंट का उपयोग करके de.schlichtherle.io.rof.ReadOnlyFile लागू करने और उसके साथ de.schlichtherle.util.zip.ZipFile बनाने की अनुशंसा करता हूं।

यह संपूर्ण संग्रह एक साथ संकुचित है के बाद से (सिर्फ एक InputStream का उपयोग कर और यह की मौत हो गई आप अपनी प्रविष्टि है जब से परे) संकुचित टीएआर अभिलेखागार के लिए किसी भी लाभ प्रदान नहीं करेगा।

2

TrueZIP 7.2 के बाद, मॉड्यूल TrueZIP पथ में एक नया क्लाइंट API है। यह जेएसई 7 के लिए एक एनआईओ 2 फाइलसिस्टमप्रोवाइडर का कार्यान्वयन है।इस एपीआई का उपयोग करके, आप HTTP यूआरआई को निम्नानुसार एक्सेस कर सकते हैं:

Path path = new TPath(new URI("http://acme.com/download/everything.tar.gz/README.TXT")); 
try (InputStream in = Files.newInputStream(path)) { 
    // Read archive entry contents here. 
    ... 
} 
संबंधित मुद्दे