मैंने निम्नलिखित कोड लिखा है जोफ़ाइल में 4000 बाइट्स 0s लिखता है। फिर, मैंने एक ही फाइल को एक ही समय में 1000 बाइट्स के टुकड़ों में पढ़ा।ऑब्जेक्टइनपुटस्ट्रीम के साथ एक समय में केवल 1024 बाइट्स क्यों पढ़ सकता हूं?
FileOutputStream output = new FileOutputStream("test.txt");
ObjectOutputStream stream = new ObjectOutputStream(output);
byte[] bytes = new byte[4000];
stream.write(bytes);
stream.close();
FileInputStream input = new FileInputStream("test.txt");
ObjectInputStream s = new ObjectInputStream(input);
byte[] buffer = new byte[1000];
int read = s.read(buffer);
while (read > 0) {
System.out.println("Read " + read);
read = s.read(buffer);
}
s.close();
मुझे उम्मीद है कि 1000 बाइट चार बार पढ़ना है।
Read 1000
Read 1000
Read 1000
Read 1000
हालांकि, वास्तव में क्या होता है कि मुझे लगता है कि मुझे हर 1024 बाइट्स "बेहतर" की कमी के लिए "रोका गया" लगता है।
Read 1000
Read 24
Read 1000
Read 24
Read 1000
Read 24
Read 928
यदि मैं 1024 से अधिक बाइट्स पढ़ने की कोशिश करता हूं, तो मुझे 1024 बाइट्स पर कैप्ड किया जाता है। अगर मैं 1024 बाइट से कम पढ़ने की कोशिश करता हूं, तो मुझे अभी भी 1024 बाइट मार्क पर रोकना होगा।
हेक्साडेसिमल में आउटपुट फ़ाइल test.txt
का निरीक्षण करने पर, मैंने देखा 5 गैर शून्य बाइट्स 7A 00 00 04 00
1029 अलग बाइट्स की एक दृश्य तथ्य यह है कि मैं फाइल करने के लिए केवल 0s लिखा है के बावजूद है कि वहाँ,। Here is the output from my hex editor. (प्रश्न में फिट होने में बहुत लंबा होगा।)
तो मेरा सवाल है: जब मैं पूरी तरह से 0 लिखा है तो ये पांच बाइट मेरी फ़ाइल में क्यों दिख रहे हैं? क्या इन 5 बाइट्स में विराम के साथ कुछ करने के लिए कुछ 1024 बाइट होता है? यह जरूरी क्यों है?
'इनपुटस्ट्रीम.read (बाइट []) 'गारंटी नहीं देता है कि यह जितना संभव हो सके पढ़ता है। आपके द्वारा वर्णित "संक्षिप्त पढ़ने" व्यवहार पूरी तरह से कानूनी है, यहां तक कि फ़ाइल-आधारित इनपुट के लिए भी। तो यदि आप पूरे बफर को पढ़ना चाहते हैं, तो 'DataInput.readFully (बाइट [])' का उपयोग करें। – Nayuki
@NayukiMinase मैं समझता हूं। हालांकि, क्या आप कृपया बता सकते हैं कि यह 1024 बाइट चिह्न पर क्यों रुकता है? उदाहरण के लिए, यह मुझे समझ में आएगा कि अगर मैं केवल 1024 बाइट्स पर पढ़ सकता हूं, और मेरा परिणाम 1024, 1024, 1024, 928 होगा। लेकिन मैं उलझन में हूं कि यह पहले 1000 बाइट्स को ठीक क्यों पढ़ता है, लेकिन फिर यह फिर से जारी रखने से पहले अगले 24 बाइट्स पढ़ सकता है। यह पूरी तरह से मनमाना लगता है? या इसके लिए कोई कारण है? – Zsw
मुझे नहीं पता। लेकिन मैं आपके द्वारा वर्णित 5-बाइट अनुक्रम से परेशान हूं, क्योंकि न तो ऑब्जेक्ट इनपुटप्रीम के लिए जावाडोक और न ही ऑब्जेक्टऑटपुटस्ट्रीम बाइट एरे के स्वरूपण के बारे में कुछ भी कहता है। – Nayuki