2011-12-28 7 views
19

वहाँ वैसे भी जांच करने के लिए यह करने के लिए लिखने के लिए प्रयास कर रहा है और IOException पकड़ने के बिना कि क्या एक OutputStream बंद कर दिया है है?कैसे जांच करने के लिए एक OutputStream बंद कर दिया है कि क्या

public boolean isStreamClosed(OutputStream out){ 
    if(/* stream isn't closed */){ 
     return true; 
    }else{ 
     return false; 
    } 
} 

आप किस विधि से /* stream isn't closed */ की जगह सकता है:

उदाहरण के लिए, निम्न काल्पनिक विधि पर विचार?

+1

अंतर्निहित समस्या को हल करने की जरूरत है क्या है? –

+1

मुझे संदेह है कि ओपी अपवादों से निपटने से बचना चाहता है। ;) –

+0

यह मेरे से के बारे में आया बुरा आदानों मैं प्राप्त हो सकता है कि किस तरह के बारे में रक्षा सोच है, लेकिन यह एक काल्पनिक सवाल का अधिक, प्लस के लिए शीर्ष गूगल परिणाम के लिए http अंक "जावा जांच outputstream बंद कर दिया है कि क्या" है: // stackoverflow।कॉम/प्रश्न/2607515/कैसे-करें-आई-चेक-अगर-आउटपुट-स्ट्रीम-ऑफ-सॉकेट-बंद-बंद है जो वास्तव में उस प्रश्न का उत्तर नहीं देता है – chrisbunney

उत्तर

19

अंतर्निहित धारा यह अपने आप बंद हो पता नहीं हो सकता जब तक आप इसे करने के लिए लिखने के लिए प्रयास (जैसे एक सॉकेट के दूसरे छोर यह बंद कर देता है तो)

सरल दृष्टिकोण इसका इस्तेमाल और संभाल क्या हुआ अगर यह बंद हो गया होता करने के लिए है फिर, इसे पहले परीक्षण करने के बजाय भी।

कोई फर्क नहीं पड़ता कि तुम क्या परीक्षण, वहाँ हमेशा मौका है कि आप एक IOException मिल जाएगा, तो आप अपवाद हैंडलिंग कोड से बचने नहीं कर सकते हैं। इस परीक्षण को जोड़ना कोड को जटिल करने की संभावना है।

+0

दूसरों के अलावा यह उत्तर क्या सेट करता है 'isclosed() ', _ जैसी अंतर्निहित विधि नहीं होने के लिए औचित्य, _" अंतर्निहित धारा इसे तब तक बंद नहीं कर सकती जब तक आप इसे लिखने का प्रयास नहीं करते "_, इसलिए स्वीकार किया गया, धन्यवाद :) – chrisbunney

+0

isclosed() कॉल करने के बाद सत्य है अपने अंत में बंद करें()। ऐसा नहीं है कि ज्यादातर लोग इसे करना चाहते हैं। ;) –

2

OutputStream ही इस तरह के एक विधि का समर्थन नहीं करता। क्लोजेबल इंटरफ़ेस को इस तरीके से परिभाषित किया गया है कि एक बार जब आप क्लोज़() को कॉल करते हैं तो आप उस आउटपुटस्ट्रीम का निपटान करने जा रहे हैं।

हो सकता है कि आप थोड़ा आवेदन के डिज़ाइन को संशोधित और जाँच क्यों आपको लगता है कि नहीं कर रहे हैं और आप एक बंद OutputStream उदाहरण अभी भी अपने आवेदन में चारों ओर चल रहे हैं के साथ समाप्त कर रहे हैं चाहिए। आप अपने खुद के लागू

1

नंबर हैं, तो आप एक isClosed विधि लिख सकता है, लेकिन अगर आप, ठोस वर्ग पता नहीं है तो कोई। आउटपुटस्ट्रीम सिर्फ एक सार वर्ग है।

/** 
* Closes this output stream and releases any system resources 
* associated with this stream. The general contract of <code>close</code> 
* is that it closes the output stream. A closed stream cannot perform 
* output operations and cannot be reopened. 
* <p> 
* The <code>close</code> method of <code>OutputStream</code> does nothing. 
* 
* @exception IOException if an I/O error occurs. 
*/ 
public void close() throws IOException { 
} 
+0

'आउटपुटस्ट्रीम' एक अमूर्त वर्ग नहीं है, इसलिए यह कुछ कार्यान्वयन प्रदान कर सकता है? – chrisbunney

+0

हाँ, क्षमा करें, मेरा बुरा। हालांकि यह नहीं है। – Kylar

+1

हां, शर्म की बात यह है कि @AlexR जैसे कुछ ऐसा नहीं करता है, जो उसके उत्तर में बताता है (http://stackoverflow.com/a/8655939/110255) – chrisbunney

8

दुर्भाग्य OutputStream एपीआई isClosed() की तरह विधि नहीं है: यहाँ यह कार्यान्वयन है।

तो, मैं केवल एक स्पष्ट रास्ता पता: आपकी कक्षा StatusKnowingOutputStream कि किसी अन्य उत्पादन धारा लपेटता है और निम्नलिखित के रूप में अपनी close() विधि को लागू करता है बनाने के लिए:

public void close() { 
    out.close(); 
    closed = true; 
} 

अब विधि जोड़ने isClosed()

public boolean isClosed() { 
    return closed; 
} 
+0

हालांकि किसी भी एप्लिकेशन में इसकी आवश्यकता नहीं होनी चाहिए। यदि आपका स्वयं का कोड स्ट्रीम बंद कर देता है - तो उसे इसके राज्य को भी बंद करना चाहिए (बंद/खुला)। यदि आप कुछ 3-पार्टी पार्टी लाइब्रेरी से स्ट्रीम प्राप्त करते हैं - तो इसे कुछ 'बूलियन canIUseTheStream()' विधि प्रदान करनी चाहिए। – bezmax

+0

@bezmax, यह अपने राज्य को संभालने में थोड़ा मुश्किल हो सकता है, मान लीजिए कि क्या आप इसे अपनी व्यावसायिक विधि में बंद करने की उम्मीद करते हैं (आपको इसे कहीं और भेजने के लिए बंद करना होगा) लेकिन आपको इसे ' अंत में 'खंड, ताकि अपवाद होने पर इसे बंद कर दिया जा सके। –

2
public boolean isStreamClosed(FileOutputStream out){ 
    try { 
     FileChannel fc = out.getChannel(); 
     return fc.position() >= 0L; // This may throw a ClosedChannelException. 
    } catch (java.nio.channels.ClosedChannelException cce) { 
     return false; 
    } catch (IOException e) { 
    } 
    return true; 
} 

यह केवल एक फ़ाइलऑटपुटस्ट्रीम के लिए संभव है!

-2

out.checkError का उपयोग करके()

while(!System.out.checkError()) { 
    System.out.println('hi'); 
} 

यह पाया गया: How do I get java to exit when piped to head

+1

यह System.out ** प्रिंटस्ट्रीम ** के लिए काम कर सकता है, और वास्तव में किसी भी प्रिंटस्ट्रीम पर काम करता है, लेकिन सामान्य रूप से आउटपुटस्ट्रीम पर काम नहीं करता है। – IceArdor

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

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