24

मुझे पता है कि संसाधन जो आप कोशिश करते हैं, स्वचालित रूप से बंद हो जाएगा यदि संसाधन ऑटोक्लोसेबल लागू किया गया हो। अब तक सब ठीक है। लेकिन जब मैं कई संसाधन प्राप्त करता हूं तो मैं क्या करूँगा जो मैं स्वचालित रूप से बंद करना चाहता हूं। सॉकेट के साथ उदाहरण;ऑटोक्लोसेबल (कोशिश-के-संसाधनों) के साथ कई संसाधन बंद करें

try (Socket socket = new Socket()) { 
    input = new DataInputStream(socket.getInputStream()); 
    output = new DataOutputStream(socket.getOutputStream()); 
} catch (IOException e) { 
} 

तो मैं जानता हूँ कि सॉकेट ठीक से बंद कर दिया जाएगा, क्योंकि यह कोशिश में एक पैरामीटर के रूप में पारित है, लेकिन कैसे इनपुट और आउटपुट ठीक से बंद किया जाना चाहिए?

उत्तर

31

संसाधनों के साथ प्रयास करें, उन्हें सभी को ब्रांड्स में घोषित करके कई संसाधनों के साथ उपयोग किया जा सकता है। अपने वस्तुओं AutoClosable लागू नहीं है (DataInputStream करता है),

public static void writeToFileZipFileContents(String zipFileName, 
              String outputFileName) 
              throws java.io.IOException { 

    java.nio.charset.Charset charset = 
     java.nio.charset.StandardCharsets.US_ASCII; 
    java.nio.file.Path outputFilePath = 
     java.nio.file.Paths.get(outputFileName); 

    // Open zip file and create output file with 
    // try-with-resources statement 

    try (
     java.util.zip.ZipFile zf = 
      new java.util.zip.ZipFile(zipFileName); 
     java.io.BufferedWriter writer = 
      java.nio.file.Files.newBufferedWriter(outputFilePath, charset) 
    ) { 
     // Enumerate each entry 
     for (java.util.Enumeration entries = 
           zf.entries();  entries.hasMoreElements();) { 
      // Get the entry name and write it to the output file 
      String newLine = System.getProperty("line.separator"); 
      String zipEntryName = 
       ((java.util.zip.ZipEntry)entries.nextElement()).getName() 
      newLine; 
      writer.write(zipEntryName, 0, zipEntryName.length()); 
     } 
    } 
} 

या कोशिश के साथ-संसाधनों से पहले घोषित किया जाना चाहिए, तो: documentation

प्रासंगिक कोड अंश जुड़ा हुआ प्रलेखन से देखें उन्हें बंद करने के लिए उपयुक्त स्थान finally ब्लॉक में है, जो लिंक किए गए दस्तावेज़ों में भी उल्लेख किया गया है।

12

चिंता न करें, चीजें "बस काम करेंगी"। Socket's documentation से:

इस सॉकेट को बंद करना सॉकेट के इनपुटस्ट्रीम और आउटपुटस्ट्रीम को भी बंद कर देगा।

try (Socket socket = new Socket(); 
    InputStream input = new DataInputStream(socket.getInputStream()); 
    OutputStream output = new DataOutputStream(socket.getOutputStream());) { 
} catch (IOException e) { 
} 

यह:

मैं स्पष्ट रूप से इनपुट और आउटपुट वस्तुओं पर close() ना बुलाने की और वास्तव में यह सुनिश्चित करने के लिए सभी संसाधनों स्वतः try-with-resources ब्लॉक द्वारा प्रबंधित कर रहे हैं आम तौर पर बेहतर है, इस तरह के बारे में आपकी चिंता को समझते इसका प्रभाव होगा कि सॉकेट ऑब्जेक्ट "कई बार बंद हो जाएगा", लेकिन इससे कोई नुकसान नहीं होना चाहिए (यह कारणों में से एक है कि आम तौर पर यह सलाह दी जाती है कि close() के सभी कार्यान्वयन को बेवकूफ़ बना दिया जाए)।

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