2014-09-17 6 views
5

इम एक सरल टीसीपी बनाने/आईपी सॉकेट एप्लिकेशनDataInputStream.read() बनाम DataInputStream.readFully()

क्या ऐसा करने के बीच अलग:

DataInputStream in = new DataInputStream(clientSocket.getInputStream()); 

byte[] buffer = new byte[100]; 
in.read(buffer); 
: ऐसा करने बनाम

DataInputStream in = new DataInputStream(clientSocket.getInputStream()); 

byte[] buffer = new byte[100]; 
in.readFully(buffer); 

मैंने प्रलेखन पर एक नज़र डाली थी, उनके पास एक ही सटीक वर्णन है। readFully() और read() तो क्या मैं इसे वही मान सकता हूं?

+0

आप ईओएफ को कैसे संभालना चाहते हैं (जिसका मतलब है कि सॉकेट पर पढ़ने के लिए कोई और बाइट नहीं है)? दोनों की परिभाषाओं को फिर से देखें और न केवल विवरण। एक मूल्य देता है और एक अपवाद फेंकता है। – scrappedcola

+0

@scrappedcola ओह ठीक है, अब मैं देखता हूं। तो मूल रूप से, 'readFully() 'लौटाता है जब बफर पूर्ण होता है, भले ही वहां और बाइट पढ़ने के लिए शेष हों। और जब सभी बाइट्स पढ़े जाते हैं तो पढ़ें() 'रिटर्न। सही बात? – Krimson

+0

नहीं 'पढ़ा() 'रिटर्न जब कम से कम एक बाइट पढ़ा गया है; 'बफर भर गया है जब' पढ़ें पूरी तरह से() '। – EJP

उत्तर

9

DataInput.readFully(byte[] b) राज्यों के लिए जावाडोक:

बफर सरणी b में एक इनपुट स्ट्रीम और उन्हें स्टोर से कुछ बाइट्स पढ़ता है। पढ़ने वाले बाइट्स की संख्या b की लंबाई के बराबर है।

DataInputStream.read(byte[] b) राज्यों के लिए जावाडोक:

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

असल में, readFully()बिल्कुलb.length बाइट्स पढ़ा जाएगा, जबकि read()b.length, हो सकता है कम, जो कुछ भी इनपुट धारा से उपलब्ध है अप करने के लिए पढ़ा जाएगा।

+1

सही, मैंने यही सोचा। स्पष्टीकरण – Krimson

+3

के लिए धन्यवाद, मैं जोड़ सकता हूं कि 'readFully() '** नेटवर्क आधारित संचालन ** में बेहतर है। लंबे संदेशों को भेजते समय मुझे केवल 'पढ़ने()' के साथ परेशानी थी (बफर ** उदाहरण के लिए बाइट ** के 5K से अधिक)। संदेश का केवल 'पढ़ने()' भाग का उपयोग करते समय गायब था और '?' वर्णों द्वारा प्रतिस्थापित किया गया था। 'ReadFully()' का उपयोग करके मेरी समस्या हल हो गई: पूरा संदेश पढ़ा गया है, कोई भी अक्षर गुम नहीं है। ;-) आशा करता हूँ की ये काम करेगा ! ;-) – Mackovich

+0

रीडफुल() विधि को बाधित कैसे करें यदि मुझे टाइमआउट के बाद ऐसा करना है? – user2602807

0

का उपयोग पढ़ आप वापसी मान की जाँच करने को पता है कि कितने बाइट्स वास्तव में किया गया है readFully एक IOException अगर 100 बाइट्स पढ़ा नहीं जा सका फेंक दिया जाएगा, डॉन के साथ

byte[] buffer = new byte[100]; 
if (in.read(buffer) < 100){ 
    // fail 
    } 

बजाय पढ़ जरूरत वापसी मूल्य की जांच करने की आवश्यकता नहीं है, थोड़ा सा सरल करें।

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