2009-07-13 11 views
39

के आकार का निर्धारण करें मेरी वर्तमान स्थिति है: मुझे एक फ़ाइल पढ़नी है और सामग्री को InputStream में रखना है। इसके बाद मुझे InputStream की सामग्री को बाइट सरणी में रखने की आवश्यकता है, जिसके लिए InputStream का आकार आवश्यक है (जहां तक ​​मुझे पता है)। कोई विचार?एक इनपुटस्ट्रीम

के रूप में अनुरोध किया है, मैं इनपुट धारा है कि मैं एक अपलोड की गई फ़ाइल

InputStream uploadedStream = null; 
FileItemFactory factory = new DiskFileItemFactory(); 
ServletFileUpload upload = new ServletFileUpload(factory); 
java.util.List items = upload.parseRequest(request);  
java.util.Iterator iter = items.iterator(); 

while (iter.hasNext()) { 
    FileItem item = (FileItem) iter.next(); 
    if (!item.isFormField()) { 
     uploadedStream = item.getInputStream(); 
     //CHANGE uploadedStreambyte = item.get() 
    } 
} 

से बनाने रहा अनुरोध एक HttpServletRequest वस्तु है, जो FileItemFactory की तरह है और ServletFileUpload अपाचे कॉमन्स FileUpload पैकेज से है दिखाएगा।

उत्तर

10

मैं बस जोड़ना चाहता था, अपाचे कॉमन्स आईओ में स्ट्रीम समर्थन उपयोगिताएं हैं प्रतिलिपि करें। (Btw, क्या आप एक InputStream में फ़ाइल रखकर मतलब है आप हमें अपने कोड दिखा सकते हैं??)

संपादित करें:

ठीक है, क्या आप आइटम की सामग्री के साथ क्या करना चाहते हैं? एक बाइट सरणी में पूरी चीज item.get()which returns है।

EDIT2

item.getSize() अपलोड file size वापस आ जाएगी।

+0

मैं वर्तमान में डेटाबेस में एक ब्लॉब फ़ील्ड में फ़ाइल को सहेजता हूं और मैं इसे एक बाइनरीस्ट्रीम (इनपुटस्ट्रीम के रूप में इनपुट) के रूप में भेजता हूं, अब मुझे एक बाइट सरणी में इनपुटस्ट्रीम की आवश्यकता होती है क्योंकि मुझे डेटा का हस्ताक्षर करने की आवश्यकता होती है और फ़ंक्शन केवल लेता है बाइट सरणी जैसा कि मैंने उल्लेख किया है, – ChronoXIII

+1

item.get() आपको बाइट सरणी बनाता है। और प्रदर्शन के आकार के बारे में चिंता न करें जबतक कि आप कई एमबी छवियों के साथ काम नहीं कर रहे हैं। – akarnokd

+0

यह मामला हो सकता है क्योंकि छवि किसी उपयोगकर्ता द्वारा अपलोड की जाती है, और मुझे सर्वर की तरफ ऑटो ट्रिम छवियों का कोई तरीका नहीं दिख रहा है। :( – ChronoXIII

16

आप इसे पढ़ने के बिना स्ट्रीम में डेटा की मात्रा निर्धारित नहीं कर सकते हैं; आप, हालांकि, एक फ़ाइल के आकार के लिए पूछ सकते हैं:

http://java.sun.com/javase/6/docs/api/java/io/File.html#length()

अगर यह संभव नहीं है, आप बाइट्स आप एक ByteArrayOutputStream जो के रूप में आवश्यक बढ़ेगा के लिए इनपुट स्ट्रीम से पढ़ने लिख सकते हैं।

+0

मेरी परिदृश्य में InputStream एक HTML प्रपत्र से किसी अपलोड फ़ाइल है, मैं फ़ाइल आकार के बाद से मैं हार्ड ड्राइव बंद फ़ाइल लोड नहीं कर रहा हूँ नहीं मिल सकता है। – ChronoXIII

+1

यदि आपकी इनपुट स्ट्रीम में मार्क() समर्थन है, तो आप शुरुआत में चिह्नित कर सकते हैं और इसे पूरी तरह से पढ़ सकते हैं - फिर रीसेट करें() और इसे प्रोसेस करना प्रारंभ करें। – akarnokd

+1

फ़ाइल एक छवि है (संभावित रूप से बड़ी) तो स्ट्रीम के माध्यम से दो बार पढ़ने से प्रदर्शन के मुद्दे नहीं होंगे? – ChronoXIII

24

मैं ByteArrayOutputStream में पढ़ूंगा और फिर परिणामी बाइट सरणी प्राप्त करने के लिए toByteArray() पर कॉल करूंगा। आपको पहले से आकार को परिभाषित करने की आवश्यकता नहीं है (हालांकि यह संभवतः एक अनुकूलन है यदि आप इसे जानते हैं। कई मामलों में आप नहीं करेंगे)

+0

मुझे लगता है कि इनपुटस्ट्रीम में एक ToString() विधि है और फिर मैं स्ट्रिंग के बाइट सरणी को बनाने के लिए केवल getBytes() को कॉल कर सकता हूं। मैं सोच रहा हूं कि ऐसा करने से कोई प्रदर्शन समस्या है या नहीं? – ChronoXIII

+0

आपको बाइट्स/चरित्र रूपांतरणों से सावधान रहना होगा। क्या यह मूल रूप से एक बाइट स्ट्रीम है? यदि इसमें वर्ण हैं, तो वे कैसे एन्कोड किए गए हैं। यदि आप इन्हें नेटवर्क कनेक्शन के माध्यम से प्राप्त कर रहे हैं, तो मुझे संदेह होगा कि यह आपकी मुख्य प्रदर्शन बाधा है और मैं रूपांतरण ओवरहेड –

+0

के बारे में चिंता नहीं करता हूं, वर्तमान में मैं छवि के साथ इनपुटस्ट्रीम को पढ़ता हूं एक बाइनरीस्ट्रीम के रूप में डेटाबेस, यह अच्छी तरह से काम करता प्रतीत होता है क्योंकि मैं फ़ाइल को बाद में फ़ाइल पढ़ सकता हूं और यह अभी भी एक छवि – ChronoXIII

3

आप इस नीचे दिए गए लिंक

Get Bytes from Inputstream

+0

के लिए अधिक ठीक ट्यून किया गया था, यह भी नहीं होना चाहिए सही उत्तर? इस समाधान के साथ कोई समस्या है? – Arlyn

27

यह एक वास्तव में पुराने धागा है जाँच Utils.java की getBytes (InputStream) का उपयोग कर InputStream के आकार प्राप्त कर सकते हैं, लेकिन यह अभी भी पॉप अप करने के पहली बात यह थी जब मैंने इस मुद्दे को गुमराह किया। तो मैं बस इसे जोड़ना चाहता था:

InputStream inputStream = conn.getInputStream(); 
int length = inputStream.available(); 

मेरे लिए काम किया। और यहां अन्य उत्तरों की तुलना में बहुत आसान है।

+38

मुझे नहीं लगता कि यह सही है। जावाडॉक्स से: "ध्यान दें कि इनपुटस्ट्रीम के कुछ कार्यान्वयन धारा में बाइट्स की कुल संख्या वापस कर देंगे, कई लोग नहीं करेंगे। इस विधि के रिटर्न वैल्यू का उपयोग करने के लिए कभी भी सही नहीं है, ताकि इसमें सभी डेटा रखने के लिए एक बफर आवंटित किया जा सके। धारा। " तो यह आपके वीएम पर काम कर सकता है, लेकिन शायद किसी और के काम नहीं कर सकता है। http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#available() – Marvo

+3

ओह मनोविज्ञान। अच्छा पकड़ा! मुझे लगता है कि यह चाल कोड के लिए अच्छा नहीं है जिसे पोर्टेबल होने की आवश्यकता है। मैं एक स्कूल परियोजना के लिए उपयोग कर रहा था, इसलिए यह मेरे लिए काम किया। धन्यवाद, भविष्य के लिए जानना अच्छा है! –

+4

यह सही है जब आपके पास बाइटएरेइन इनपुट स्ट्रीम में स्मृति में सभी डेटा हैं। – stacker

-1

इस विधि का प्रयोग करें, तो आप सिर्फ InputStream

public String readIt(InputStream is) { 
    if (is != null) { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 8); 

     StringBuilder sb = new StringBuilder(); 
     String line; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line).append("\n"); 
     } 
     is.close(); 
     return sb.toString(); 
    } 
    return "error: "; 
} 
+1

-1, यह मानता है कि 'इनपुटस्ट्रीम' हमेशा एक स्ट्रिंग है (नहीं जरूरी है क्योंकि यह द्विआधारी डेटा हो सकता है), और किसी भी मामले में यह धारा के आकार को वापस नहीं करता है, जिस पर सवाल पूछा गया है। इसके अलावा यह डेटा को अतिरिक्त बाइट्स ('\ n') जोड़ता है, इसलिए 'sb.length()' भी गलत होगा। –

+0

ठीक है, मैं समझता हूं, इसलिए यह उपयोगी है जब आप जानते हैं कि आप 'स्ट्रिंग' स्ट्रीम प्राप्त करने की उम्मीद कर रहे हैं। \ n' वास्तव में जरूरी है क्योंकि आपको प्राप्त इनपुट में कुछ प्रारूप देना है, मुझे कोरिज़ो लंबे 'स्ट्रिंग' नहीं चाहिए, इसलिए उन '\ n' गणना भी। –

0

पारित करने के लिए एक ByteArrayInputStream तो इस पेज पर टिप्पणी आप .available() समारोह का उपयोग कर सकते आकार पाने के लिए में से कुछ के विपरीत के साथ जब स्पष्ट रूप से काम कर रहा है। इससे पहले कि आप इसे पढ़ना शुरू करें, बस इसे करना होगा।

Javadocs से:

शेष बाइट्स कि इस इनपुट धारा से पढ़ा जा सकता है (या अधिक को छोड़ दिया) की संख्या देता है। लौटाया गया मूल्य गिनती है - pos, जो इनपुट बफर से पढ़ने के लिए शेष बाइट्स की संख्या है।

https://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayInputStream.html#available()

0
try { 
     InputStream connInputStream = connection.getInputStream(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    int size = connInputStream.available(); 

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

InputStream - Android SDK | Android Developers

संबंधित मुद्दे