2010-07-11 8 views
19

से बाइनरी फ़ाइल पढ़ना मैं URLConnection से एक बाइनरी फ़ाइल पढ़ने की कोशिश कर रहा हूं। जब मैं इसे एक टेक्स्ट फ़ाइल के साथ परीक्षण करता हूं तो यह ठीक काम करता प्रतीत होता है लेकिन बाइनरी फाइलों के लिए यह नहीं करता है। जब फ़ाइल भेजती है तो मैं सर्वर पर निम्न माइम-प्रकार का उपयोग कर रहा हूं:URLConnection

application/octet-stream 

लेकिन अभी तक कुछ भी काम नहीं करता है। इस कोड है कि मैं फ़ाइल प्राप्त करने के लिए उपयोग करते हैं:

file = File.createTempFile("tempfile", ".bin"); 
file.deleteOnExit(); 

URL url = new URL("http://somedomain.com/image.gif"); 

URLConnection connection = url.openConnection(); 

BufferedReader input = new BufferedReader(new InputStreamReader(connection.getInputStream())); 

Writer writer = new OutputStreamWriter(new FileOutputStream(file)); 

int c; 

while((c = input.read()) != -1) { 

    writer.write((char)c); 
} 

writer.close(); 

input.close(); 

उत्तर

34

यह कैसे मैं यह कर रहा है,

input = connection.getInputStream(); 
byte[] buffer = new byte[4096]; 
int n; 

OutputStream output = new FileOutputStream(file); 
while ((n = input.read(buffer)) != -1) 
{ 
    output.write(buffer, 0, n); 
} 
output.close(); 
+7

'n> 0' परीक्षण अनावश्यक है। जावाडॉक्स के मुताबिक, एकमात्र मामला जहां शून्य लौटाया जा सकता है वह तब होता है जब 'बफर। लम्बाई' शून्य होता है। –

+5

... और किसी भी मामले में शून्य लंबाई लिखना हानिरहित है। – EJP

+0

आपने मेरा दिन बचाया :) –

14

आप एक बाइनरी धारा को पढ़ने के लिए कोशिश कर रहे हैं, तो आप किसी भी तरह के एक Reader में InputStream लपेट नहीं करना चाहिए। InputStream.read(byte[], int, int) विधि का उपयोग कर डेटा को बाइट सरणी बफर में पढ़ें। फिर बफर से FileOutputStream पर लिखें।

जिस तरीके से आप वर्तमान में फ़ाइल को पढ़ रहे/लिख रहे हैं, उसे इसे "वर्ण" में परिवर्तित कर दिया जाएगा और आपके प्लेटफ़ॉर्म के डिफ़ॉल्ट वर्ण एन्कोडिंग का उपयोग करके बाइट्स पर वापस कर दिया जाएगा। यह द्विआधारी डेटा को उलझाने के लिए उत्तरदायी है।

(एक वर्णमाला (लैटिन -1) है जो बाइट्स और char वैल्यू-स्पेस के सबसेट के बीच 1-से-1 लापरवाह मैपिंग प्रदान करता है। हालांकि मैपिंग काम करते समय भी यह एक बुरा विचार है। अनुवाद करने जा/char[] को byte[] से बाइनरी डेटा कॉपी करने और फिर से वापस ... जो इस संदर्भ में कुछ भी नहीं प्राप्त होता है।)

+0

या फिर आप अपने InputStream ऊपर लपेटकर कोशिश कर सकते हैं BufferedInputStream में। – bhups

+1

@bhups - यह सच है, लेकिन यह केवल तभी मदद करेगा यदि आप बहुत सारे छोटे पढ़ने के लिए जा रहे हैं। यदि आप विशेष रूप से बड़े ब्लॉक को पढ़ते हैं, तो BufferedInputStream वास्तव में थोड़ी देर के माध्यम से कम करेगा। –

+1

यह सही है; 'इनपुटस्ट्रीम रीडर' बाइट डेटा को यूटीएफ -16 चरित्र डेटा में बदल देगा (इस मामले में, डिफ़ॉल्ट प्लेटफॉर्म एन्कोडिंग का उपयोग करके, जो पाठ/सादे के लिए भी एक बुरा विचार है)। जावा चार एक ऑक्टेट नहीं है क्योंकि यह कुछ अन्य भाषाओं में है। – McDowell