बाइट [] इनपुटस्ट्रीम या आउटपुटस्ट्रीम में


129

मैं अपने डेटाबेस तालिका में एक ब्लॉब स्तंभ है, जिसके लिए मैं उपयोग करने के लिए byte[]एक मानचित्रण के रूप में मेरे जावा प्रोग्राम में और इस डेटा मैं उपयोग करने के लिए यह करने के लिए कन्वर्ट करने के लिए InputStreamया OutputStream। लेकिन मुझे नहीं पता कि जब मैं ऐसा करता हूं तो आंतरिक रूप से क्या होता है। क्या कोई मुझे यह समझा सकता है कि जब मैं यह रूपांतरण कर रहा हूँ तो क्या हो रहा है?


2
शीर्षक "बाइट्स की सरणी नहीं होना चाहिए ..." या "बाइट सरणी ..." या "बाइट [] ..." "बाइट ऑफ़ सरणी" ...?
kuester2000

1
यहाँ उल्टा देखें: stackoverflow.com/questions/1264709/…
Jay Taylor

जवाबों:


198

आप बाइट सरणी I / O स्ट्रीम बनाते हैं और उसका उपयोग करते हैं:

byte[] source = ...;
ByteArrayInputStream bis = new ByteArrayInputStream(source);
// read bytes from bis ...

ByteArrayOutputStream bos = new ByteArrayOutputStream();
// write bytes to bos ...
byte[] sink = bos.toByteArray();

यह मानते हुए कि आप JDBC ड्राइवर का उपयोग कर रहे हैं, जो मानक JDBC Blob इंटरफ़ेस (सभी नहीं करते हैं) को लागू करता है, आप भी और विधियों 1 का उपयोग करके एक InputStreamया OutputStreamएक बूँद से कनेक्ट कर सकते हैं , और आप सीधे बाईबैक प्राप्त कर सकते हैं और सेट कर सकते हैं।getBinaryStreamsetBinaryStream

(सामान्य तौर पर, आप किसी भी अपवाद है, और करीब धाराओं को संभालने के लिए उचित कदम उठाने चाहिए हालांकि, बंद करने। bisऔर bosउदाहरण में ऊपर हैं क्योंकि वे किसी भी बाहरी संसाधनों के साथ संबद्ध नहीं हैं, अनावश्यक है, जैसे फ़ाइल वर्णनकर्ता, सॉकेट, डेटाबेस कनेक्शन।)

1 - setBinaryStreamविधि वास्तव में एक गटर है। जाओ पता लगाओ।


13

मैं मान रहा हूं कि आप 'उपयोग' का अर्थ पढ़ते हैं, लेकिन जो मैं पढ़े गए मामले के लिए समझाता हूं, वह मूल रूप से लेखन मामले के लिए उलटा हो सकता है।

इसलिए आप एक बाइट [] के साथ समाप्त होते हैं। यह किसी भी प्रकार के डेटा का प्रतिनिधित्व कर सकता है जिसे विशेष प्रकार के रूपांतरण (चरित्र, एन्क्रिप्टेड, आदि) की आवश्यकता हो सकती है। आइए दिखाते हैं कि आप इस डेटा को फ़ाइल के रूप में लिखना चाहते हैं।

सबसे पहले आप एक ByteArrayInputStream बना सकते हैं, जो मूल रूप से किसी चीज को क्रम में बाइट्स की आपूर्ति करने के लिए एक तंत्र है।

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

अन्त में आप OutputStream को InputStream लिखेंगे। इस मामले में, बाइट्स की सरणी को लिखने के लिए FileOutputStream के क्रम में भेजा जाएगा। इसके लिए मैं IOUtils का उपयोग करने की सलाह देता हूं

byte[] bytes = ...;//
ByteArrayInputStream in = new ByteArrayInputStream(bytes);
FileOutputStream out = new FileOutputStream(new File(...));
IOUtils.copy(in, out);
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);

और रिवर्स में

FileInputStream in = new FileInputStream(new File(...));
ByteArrayOutputStream out = new ByteArrayOutputStream();
IOUtils.copy(in, out);
IOUtils.closeQuietly(in);
IOUtils.closeQuietly(out);
byte[] bytes = out.toByteArray();

यदि आप उपरोक्त कोड स्निपेट का उपयोग करते हैं, तो आपको अपवादों को संभालने की आवश्यकता होगी और मैं आपको अंततः ब्लॉक में 'क्लोज' करने की सलाह देता हूं।


didnt तुम्हारा मतलब है - बाइटएयरऑउटपुटस्ट्रीम आउट = नया बाइटअरेऑउटपुटस्ट्रीम (); इसके बजाय byteArrayOutputStream आउट = new ByteArrayInputStream ();
अवीहाई मार्चियानो

क्लोजक्विली शायद एक अंतिम क्लॉज में होना चाहिए।
जस्टिनकेएसयू

5

हम ByteArrayInputStream का उपयोग करके बाइट [] सरणी को इनपुट स्ट्रीम में बदल सकते हैं

String str = "Welcome to awesome Java World";
    byte[] content = str.getBytes();
    int size = content.length;
    InputStream is = null;
    byte[] b = new byte[size];
    is = new ByteArrayInputStream(content);

पूर्ण उदाहरण के लिए कृपया यहाँ देखें:


4

InputStream / OutputStream और जिस बाइट के साथ वे काम कर रहे हैं, उसके बीच कोई रूपांतरण नहीं है। वे बाइनरी डेटा के लिए बने होते हैं, और बस एक-एक करके बाइट्स पढ़ते हैं (या लिखते हैं)।

जब आप बाइट से चार तक जाना चाहते हैं तो रूपांतरण की आवश्यकता होती है। फिर आपको एक चरित्र सेट का उपयोग करके परिवर्तित करना होगा। यह तब होता है जब आप बाइट्स से स्ट्रिंग या रीडर बनाते हैं, जो चरित्र डेटा के लिए बनाए जाते हैं।


1
output = new ByteArrayOutputStream();
...
input = new ByteArrayInputStream( output.toByteArray() )

0

मुझे पता है कि इस सवाल के लिए मेरा जवाब देर से आता है लेकिन मुझे लगता है कि समुदाय इस मुद्दे पर एक नया दृष्टिकोण चाहता है


सर्कुलर बफ़र्स ओपी की समस्या का समाधान नहीं करते हैं। प्रश्न के लिखित रूप में, ओपी को एक बाइट सरणी में संपूर्ण सामग्री की आवश्यकता होती है।
स्टीफन सी

0
byte[] data = dbEntity.getBlobData();
response.getOutputStream().write();

मुझे लगता है कि यह बेहतर है क्योंकि आपके पास प्रतिक्रिया ऑब्जेक्ट में पहले से ही एक मौजूदा आउटपुटस्ट्रीम है। कोई नया आउटपुटस्ट्रीम बनाने की आवश्यकता नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.