2008-09-09 7 views
8

Sun Documentation for DataInput.skipBytes कहता है कि यह "छोड़े गए बाइट्स को छोड़कर इनपुट स्ट्रीम से डेटा के एन बाइट्स को छोड़ने का प्रयास करता है। हालांकि, यह कुछ छोटी संख्या में बाइट्स को छोड़ सकता है, संभवतः शून्य। यह किसी भी से हो सकता है शर्तों की संख्या; एन बाइट्स से पहले फ़ाइल के अंत तक पहुंचने से पहले ही एक संभावना है। "DataInputStream.skipBytes (n) कब बाइट्स को छोड़ नहीं सकता है?

  1. फ़ाइल के अंत तक पहुँचने के अलावा, क्यों skipBytes() बाइट्स की सही संख्या को छोड़ नहीं सकता है? (DataInputStream मैं उपयोग कर रहा हूँ या तो एक FileInputStream या एक PipedInputStream लपेटकर किया जाएगा।)

  2. मैं निश्चित रूप से n बाइट्स छोड़ सकते हैं और अगर यह मुझे फ़ाइल के अंत में जाने के लिए कारण बनता है एक EOFException फेंक करना चाहते हैं, मैं का उपयोग करना चाहिए readFully() और परिणामस्वरूप बाइट सरणी को अनदेखा करें? या कोई बेहतर तरीका है?

उत्तर

5

1) वहाँ है कि अधिक डेटा को पढ़ने के लिए उपलब्ध नहीं हो सकता (पाइप के दूसरे छोर भेज दिया है नहीं हो सकता है अधिक डेटा अभी तक), और लागू करने वर्ग गैर अवरुद्ध (हो सकता है कि यानी यह सिर्फ होगा अनुरोध को पूरा करने के लिए पर्याप्त डेटा की प्रतीक्षा करने के बजाय, यह क्या कर सकता है)।

मुझे नहीं पता कि कोई कार्यान्वयन वास्तव में इस तरह से व्यवहार करता है, लेकिन इंटरफ़ेस को इसे अनुमति देने के लिए डिज़ाइन किया गया है।

एक और विकल्प यह है कि फ़ाइल पढ़ने के माध्यम से भाग-मार्ग बंद हो जाती है।

2) या तो पढ़ें पूरी तरह से() (जो हमेशा पर्याप्त इनपुट के लिए प्रतीक्षा करेगा या फिर असफल हो) या एक लूप में skipBytes() को कॉल करें। मुझे लगता है कि पूर्व शायद बेहतर है, जब तक कि सरणी वास्तव में विशाल न हो।

1

जोश ब्लोच ने हाल ही में इसे प्रचारित किया है। यह उस इनपुट में है जो इनपुटस्ट्रीम.read को जितना संभव हो उतने बाइट्स पढ़ने की गारंटी नहीं है। हालांकि, यह एपीआई विधि के रूप में पूरी तरह से व्यर्थ है। इनपुटस्ट्रीम शायद भी पढ़ा जाना चाहिए पूरी तरह से।

1

यह पता चला है कि पढ़ना पूरी तरह से() अधिक प्रदर्शन ओवरहेड जोड़ता है, जिसे मैं तैयार करना चाहता हूं।

अंत में मैंने समझौता किया: मैं skipBytes() को एक बार कॉल करता हूं, और यदि यह बाइट्स की सही संख्या से कम लौटाता है, तो मैं शेष बाइट्स के लिए readFully() को कॉल करता हूं।

1

आज मैं इस समस्या से आया हूं। यह वर्चुअल मशीन पर नेटवर्क कनेक्शन को पढ़ रहा था, इसलिए मुझे लगता है कि ऐसा होने के कई कारण हो सकते हैं। मैंने बस बाइट्स को छोड़ने के लिए इनपुट स्ट्रीम को मजबूर कर हल कर दिया जब तक कि वह बाइट्स की संख्या छोड़ देता था, मैं इसे चाहता था:

int byteOffsetX = someNumber; //n bytes to skip 
int nSkipped = 0; 

nSkipped = in.skipBytes(byteOffsetX); 
while (nSkipped < byteOffsetX) { 
    nSkipped = nSkipped + in.skipBytes(byteOffsetX - nSkipped); 
} 
संबंधित मुद्दे