2012-09-05 16 views
7
Java documentation के अनुसार

, सेट के लिए कक्षा InputStream सर्वर में निशान विधि के readlimit पैरामीटर "मार्क स्थिति अमान्य हो जाता है से पहले से पढ़ा जा सकता है कि बाइट्स की अधिकतम सीमा।"। मेरे पास sample.txt नाम की एक फ़ाइल है जिसका सामग्री "हैलो" है। और मैंने यह कोड लिखा:जावा: InputStream निशान सीमा

import java.io.*; 
public class InputStream{ 
public static void main (String[] args) throws IOException { 
    InputStream reader = new FileInputStream("sample.txt"); 
    BufferedInputStream bis = new BufferedInputStream(reader); 
    bis.mark(1); 
    bis.read(); 
    bis.read(); 
    bis.read(); 
    bis.read(); 
    bis.reset(); 
    System.out.println((char)bis.read()); 
} 
} 

आउटपुट "एच" है। लेकिन अगर मैं मार्क विधि के बाद एक से अधिक बाइट्स पढ़ता हूं, तो क्या मुझे अमान्य रीसेट विधि कॉल के लिए कोई त्रुटि नहीं मिलनी चाहिए?

उत्तर

5

मैं इसे दस्तावेज़ीकरण त्रुटि में डाल दूंगा।

BufferedInputStream के लिए गैर पैरामीटर दस्तावेज़ "इनपुटस्ट्रीम की मार्क विधि का सामान्य अनुबंध देखें", जो मुझे इंगित करता है कि BufferedInputStream अलग-अलग व्यवहार नहीं करता है, पैरामीटर दस्तावेज़ के बावजूद।

और सामान्य अनुबंध, के रूप में InputStream द्वारा निर्दिष्ट,

readlimit तर्क है इस इनपुट धारा कहती है कि कई बाइट निशान स्थिति अवैध हो जाता से पहले पढ़ने के लिए अनुमति देने के लिए [...] धारा है किसी भी डेटा को याद रखने की आवश्यकता नहीं है यदि रीडलिमिट बाइट्स स्ट्रीम

दूसरे शब्दों में, readlimit एक सुझाव है; स्ट्रीम अंडर-वादे और ओवर-डिलीवरी के लिए स्वतंत्र है।

+0

क्या आप परिदृश्य को पुन: उत्पन्न करने के लिए उपयोग करने के लिए किसी भी इनपुटस्ट्रीम कार्यान्वयन को जानते हैं जिसमें यदि मैं मार्क() के साथ सेट के मुकाबले अधिक बाइट्स पढ़ता हूं तो एक अपवाद फेंक दिया जाएगा? –

1

BufferedInputStream के कार्यान्वयन को देखते हुए, यह Javadocs में मार्कर स्थिति के महत्व (संरक्षित markpos क्षेत्र की) का वर्णन:

समय में pos फ़ील्ड का मान [markpos है] अंतिम mark विधि कहा गया था।

यह मान हमेशा -1pos के माध्यम से है। यदि इनपुट स्ट्रीम में कोई चिह्नित स्थिति नहीं है, तो यह फ़ील्ड -1 है। यदि इनपुट स्ट्रीम में कोई चिह्नित स्थिति है, तो buf[markpos]reset ऑपरेशन के बाद इनपुट के रूप में आपूर्ति करने वाला पहला बाइट है। यदि markpos नहीं -1, तो पदों buf[markpos] से सभी बाइट्स buf[pos-1] के माध्यम से बफर सरणी में (, उपयुक्त समायोजन के साथ count, pos, और markpos के मूल्यों के लिए ही वे बफर सरणी में एक अन्य जगह पर ले जाया जा सकता है) ही रहना चाहिए है; और markpos के बीच अंतर marklimit से अधिक होने तक और तब तक उन्हें त्याग दिया नहीं जा सकता है।

उम्मीद है कि इससे मदद मिलती है। read, reset की परिभाषाओं और क्लास में निजी विधि fill की परिभाषाओं पर एक नज़र डालें ताकि यह देखने के लिए कि यह सभी एक साथ कैसे संबंध रखता है।

संक्षेप में, केवल जब कक्षा अपने बफर को भरने के लिए अधिक डेटा पुनर्प्राप्त करेगी तो मार्क स्थिति को ध्यान में रखा जाएगा। mark पर कॉल की तुलना में अधिक बाइट्स पढ़े जाने पर इसे सही ढंग से अमान्य कर दिया जाएगा। नतीजतन, read पर कॉल सार्वजनिक जावाडॉक टिप्पणियों में विज्ञापित व्यवहार को ट्रिगर नहीं करेगा।

1

यह एक सूक्ष्म बग की तरह दिखता है। आप बफर को कम यदि आप, source को देखें, तो विशेष रूप से भरने() विधि sizey आप एक IOException

public static void main(String[] args) throws IOException { 
    InputStream reader = new ByteArrayInputStream(new byte[]{1, 2, 3, 4, 5, 6, 7, 8}); 
    BufferedInputStream bis = new BufferedInputStream(reader, 3); 
    bis.mark(1); 
    bis.read(); 
    bis.read(); 
    bis.read(); 
    bis.read(); 
    bis.reset(); 
    System.out.println((char)bis.read()); 
} 
2

मिल जाएगा, तो आप (कुछ समय के बाद!) देख सकते हैं कि यह केवल निशान जब यह अमान्य कर देता है पूरी तरह से है, यानी यह दस्तावेज़ीकरण के सुझाव से अधिक सहनशील है।

... 
else if (pos >= buffer.length) /* no room left in buffer */ 
    if (markpos > 0) { /* can throw away early part of the buffer */ 
    int sz = pos - markpos; 
    System.arraycopy(buffer, markpos, buffer, 0, sz); 
    pos = sz; 
    markpos = 0; 
    } else if (buffer.length >= marklimit) { 
    markpos = -1; /* buffer got too big, invalidate mark */ 
    pos = 0;  /* drop buffer contents */ 
    .... 

डिफ़ॉल्ट बफर आकार अपेक्षाकृत बड़े (8K) है, इसलिए अमान्यकरण अपने उदाहरण में शुरू हो रहा नहीं किया जाएगा।

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