दिलचस्प पोस्ट
Node.JS लिनक्स कमांड लाइन का उपयोग कर अनइंस्टाल करें? जब मैं एच का प्रयोग करना चाहिए: h: commandLink के बजाय outputLink? फ़ॉर्मेट ए टाइम स्पैन विद साल पंडस डेटाफ्रेम में पंक्तियों के सबसेट को संशोधित करना कैसे अनारक्षित सूची में कन्वर्ट करने के लिए अच्छी तरह से स्टाइल <चयन> ड्रॉपडाउन jquery का उपयोग कर? मैं jQuery के साथ एक पृष्ठ कैसे रिफ्रेश कर सकता हूं? ओपनजीएल ES में टेक्स्ट को ड्रा करें imagemagick के लिए क्यों फ़ॉन्ट सूची खाली है? कर्ल त्रुटि 60: SSL प्रमाणपत्र: स्थानीय जारीकर्ता प्रमाणपत्र प्राप्त करने में असमर्थ कोणीय 2 आंतरिक एचटीएमएल (क्लिक) बाइंडिंग एक सरणी के आकार की गणना IOS7 में स्थिति बार और नेविगेशन बार समस्या जीएनयू मेकफ़ाइल नियम एक स्रोत फ़ाइल से कुछ लक्ष्यों को उत्पन्न करता है क्या कोई एमडी 5 फिक्स्ड प्वाइंट है जहां एमडी 5 (एक्स) == एक्स? एंड्रॉइड के बारे में खत्म ()

जावा में एक बाइट सरणी में द्विआधारी इनपुट स्ट्रीम पढ़ना

प्रलेखन कहते हैं कि किसी को InputStream के आकार को निर्धारित करने के लिए available() विधि का उपयोग नहीं करना चाहिए। मैं कैसे एक बाइट सरणी में एक InputStream की पूरी सामग्री पढ़ सकता हूँ?

 InputStream in; //assuming already present byte[] data = new byte[in.available()]; in.read(data);//now data is filled with the whole content of the InputStream 

मैं एक निश्चित आकार के बफ़र में कई बार पढ़ सकता था, लेकिन तब मुझे एक बाइट सरणी में पढ़ा हुआ डेटा को जोड़ना होगा, जो मेरे लिए एक समस्या है

वेब के समाधान से एकत्रित समाधान "जावा में एक बाइट सरणी में द्विआधारी इनपुट स्ट्रीम पढ़ना"

ByteStreams आसान तरीका ByteStreams का उपयोग अमरूद और उसके ByteStreams वर्ग का है:

 byte[] bytes = ByteStreams.toByteArray(in); 

या एक फ़ाइल के लिए:

 byte[] bytes = Files.toByteArray(file); 

वैकल्पिक रूप से (यदि आप गवावा का उपयोग नहीं करना चाहते थे), तो आप एक ByteArrayOutputStream बना सकते हैं, और बार-बार एक बाइट सरणी में पढ़ सकते हैं और ByteArrayOutputStream में लिख सकते हैं ( ByteArrayOutputStream को संभाल कर सकते हैं), फिर ByteArrayOutputStream.toByteArray()ByteArrayOutputStream.toByteArray() कॉल करें।

ध्यान दें कि यह दृष्टिकोण काम करता है कि आप अपने इनपुट की लंबाई बता सकते हैं या नहीं – मान लें कि आपके पास पर्याप्त मेमोरी है, ज़ाहिर है।

यदि आप किसी फ़ाइल से पढ़ रहे हैं, तो आप ऐसा कुछ कर सकते हैं:

  File file = new File("myFile"); byte[] fileData = new byte[(int) file.length()]; DataInputStream dis = new DataInputStream(new FileInputStream(file)); dis.readFully(fileData); dis.close(); 

अपडेट (31 मई, 2014):

जावा 7 java.nio.file पैकेज में कुछ नई सुविधाओं को जोड़ता है जिसका उपयोग इस उदाहरण को कुछ पंक्तियां कम करने के लिए किया जा सकता है। Java.nio.file.files क्लास में readAllBytes () विधि देखें। यहाँ एक छोटा उदाहरण है:

 import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; // ... Path p = FileSystems.getDefault().getPath("", "myFile"); byte [] fileData = Files.readAllBytes(p); 

ध्यान दें कि, इस लेखन के समय के रूप में, एंड्रॉइड एपीआई इस (या जावा 7 में ज्यादा कुछ नहीं) का समर्थन नहीं करता है।

आप इस कार्य के लिए अपाचे कॉमन्स-ओओ का उपयोग कर सकते हैं:

इस विधि का संदर्भ लें:

 public static byte[] readFileToByteArray(File file) throws IOException 

अद्यतन करें:

जावा 7 मार्ग:

 byte[] bytes = Files.readAllBytes(Paths.get(filename)); 

और अगर यह एक पाठ फ़ाइल है और आप इसे स्ट्रिंग में परिवर्तित करना चाहते हैं (आवश्यकतानुसार एन्कोडिंग बदलें):

 StandardCharsets.UTF_8.decode(ByteBuffer.wrap(bytes)).toString() 

आप इसे चुने द्वारा पढ़ सकते हैं ( byte buffer[] = new byte[2048] ) और एक बाइटअरेऑन आउटपुटस्ट्रीम में भाग लिख सकते हैं। बाइटअरेऑन आउटपुटस्ट्रीम से आप सामग्री को एक बाइट [] के रूप में पुनः प्राप्त कर सकते हैं, इसके आकार को पहले से निर्धारित करने के लिए बिना।

मेरा मानना ​​है कि बफर लंबाई को निर्दिष्ट करने की आवश्यकता है, क्योंकि स्मृति सीमित है और आप इसे से बाहर चला सकते हैं

उदाहरण:

 InputStream in = new FileInputStream(strFileName); long length = fileFileName.length(); if (length > Integer.MAX_VALUE) { throw new IOException("File is too large!"); } byte[] bytes = new byte[(int) length]; int offset = 0; int numRead = 0; while (offset < bytes.length && (numRead = in.read(bytes, offset, bytes.length - offset)) >= 0) { offset += numRead; } if (offset < bytes.length) { throw new IOException("Could not completely read file " + fileFileName.getName()); } in.close(); 

सरणी अनुक्रमणिका के लिए अधिकतम मान पूर्णांक है। MAX_INT – यह लगभग 2 जीबी (2 ^ 31/2 147 483 647) है आपका इनपुट स्ट्रीम 2 जीबी से बड़ा हो सकता है, इसलिए आपको विखंडू में डेटा संसाधित करना है, माफ करना।

  InputStream is; final byte[] buffer = new byte[512 * 1024 * 1024]; // 512Mb while(true) { final int read = is.read(buffer); if ( read < 0 ) { break; } // do processing }