2013-02-19 2 views
7

बंद किए बिना स्कैनर बंद करें मैं अपने आवेदन के बड़े और अक्सर उपयोग किए जाने वाले हिस्से को फिर से कारक बनाने की कोशिश कर रहा हूं ताकि इसे बनाए रखना आसान हो सके।सिस्टम.in

इन तरीकों में से कुछ इनपुट के लिए उपयोगकर्ता पूछता है और इनपुट सत्यापन करता है, तो मैं एक स्कैनर और System.in का उपयोग किया है लेकिन जब मैं अपने स्कैनर बंद मैं भी करीब System.in

तो मेरे सवाल है , क्या मैं केवल System.in को CloseShieldInputStream के साथ संरक्षित करके बंद कर सकता हूं या क्या मुझे विधियों को स्कैनर से गुजरना शुरू करना चाहिए?

+0

कुछ कोड पोस्ट करें ... – nkukhar

+5

तुम सच में बंद करने के लिए की जरूरत है स्कैनर? मैं कचरा कलेक्टर इसे संभालने का सुझाव देना चाहता हूं - अंतर्निहित वस्तु को बंद किए बिना इसे बंद करने का कोई तरीका नहीं है। – ddmps

+0

मेरी विधि स्कैनर घोषित करती है, अगलीलाइन() पढ़ती है और रिटर्न देती है, स्कैनर बंद कर देती है और मुझे अगले रन पर सिरदर्द देती है। यदि मैं इसे बंद नहीं करता हूं, तो ग्रहण मुझे संभावित संसाधन रिसाव के बारे में बताता है, क्या यह अनदेखा करना सुरक्षित होगा? – deepy

उत्तर

3

तुम बस पास कस्टम डेकोरेटर को लागू करने से अनदेखा कर सकते हैं शून्य पर सेट इसे बंद किए बिना हो सकता है।

public class UnClosableDecorator extends InputStream { 

    private final InputStream inputStream; 

    public UnClosableDecorator(InputStream inputStream) { 
     this.inputStream = inputStream; 
    } 

    @Override 
    public int read() throws IOException { 
     return inputStream.read(); 
    } 

    @Override 
    public int read(byte[] b) throws IOException { 
     return inputStream.read(b); 
    } 

    @Override 
    public int read(byte[] b, int off, int len) throws IOException { 
     return inputStream.read(b, off, len); 
    } 

    @Override 
    public long skip(long n) throws IOException { 
     return inputStream.skip(n); 
    } 

    @Override 
    public int available() throws IOException { 
     return inputStream.available(); 
    } 

    @Override 
    public synchronized void mark(int readlimit) { 
     inputStream.mark(readlimit); 
    } 

    @Override 
    public synchronized void reset() throws IOException { 
     inputStream.reset(); 
    } 

    @Override 
    public boolean markSupported() { 
     return inputStream.markSupported(); 
    } 

    @Override 
    public void close() throws IOException { 
     //do nothing 
    } 
} 

और मुख्य

public static void main(String[] args) throws Exception { 
     System.setIn(new UnClosableDecorator(System.in)); 
} 
+0

क्या यह CloseShieldInputStream के अपने संस्करण को लिखने जैसा नहीं होगा? – deepy

+0

मुझे पूरा यकीन नहीं है कि आपका क्या मतलब है, लेकिन अगर आपको इनपुट स्ट्रीम के साथ कुछ क्रियाएं करने की आवश्यकता है तो यह क्रियाएं UnClosableDecorator.close() विधि – nkukhar

+1

CloseShieldInputStream एक प्रॉक्सी स्ट्रीम है जो अंतर्निहित इनपुट स्ट्रीम को बंद होने से रोकती है । http://commons.apache.org/io/apidocs/org/apache/commons/io/input/CloseShieldInputStream.html – deepy

1

तुम सिर्फ बस पकड़े चर

+0

उस ग्रहण के साथ स्कैनर कभी बंद नहीं होने के बारे में चेतावनी देता है, क्या यह अनदेखा करना सुरक्षित है? – deepy

+0

मुझे लगता है कि यह एक असंभव प्रोग्रामिंग शैली है। प्रोग्रामर खुले संसाधनों को छोड़कर समाप्त हो सकता है जो वास्तव में बंद होना चाहिए। –

11

में इसका इस्तेमाल करते हैं, बस System.in के बजाय कोई कस्टम FilterInputStream का उपयोग करें:

new FilterInputStream(System.in) { 
    @Override 
    public void close() throws IOException { 
     //don't close System.in! 
    } 
} 
+1

रास्ता आसान है! धन्यवाद। –

+2

यह बहुत कुछ है जो कॉमन्स '[CloseShieldInputStream] (http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/input/CloseShieldInputStream.html) करता है और यदि आप समाप्त होते हैं यह स्थिति, आप अपने सॉफ्टवेयर के डिजाइन पर एक और नजर डालना चाह सकते हैं। इस तरह के समाधान की आवश्यकता नहीं होनी चाहिए जबतक कि आप तीसरे पक्ष के समाधान के साथ काम नहीं कर रहे हों। (यहां सभी उत्तरों पर लागू होता है) – deepy

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

  • कोई संबंधित समस्या नहीं^_^