कोटलिन में संसाधनों के साथ प्रयास करें


149

जब मैंने tryकोटलिन में जावा -संसाधन संसाधनों के बराबर लिखने की कोशिश की , तो यह मेरे लिए काम नहीं आया।

मैंने निम्नलिखित के विभिन्न रूपों की कोशिश की:

try (writer = OutputStreamWriter(r.getOutputStream())) {
    // ...
}

लेकिन न तो काम करता है।

क्या किसी को पता है कि इसके बजाय क्या उपयोग किया जाना चाहिए? जाहिर है कोटलिन व्याकरण में इस तरह के निर्माण की परिभाषा नहीं है , लेकिन शायद मैं कुछ याद कर रहा हूं। यह निम्नानुसार कोशिश ब्लॉक के लिए व्याकरण को परिभाषित करता है:

try : "try" block catchBlock* finallyBlock?;

जवाबों:


220

नहीं है useसमारोह में kotlin stdlib ( src )।

इसे कैसे उपयोग करे:

OutputStreamWriter(r.getOutputStream()).use {
    // by `it` value you can get your OutputStreamWriter
    it.write('a')
}

3
मुझे विस्तार के तरीके बहुत पसंद हैं। इतनी सारी चीजें जो आप कर सकते हैं और अतिरिक्त भाषा सुविधाओं की आवश्यकता नहीं है।
किरिल रहमान

20
इसे जोड़ने के लिए, वास्तव में एक विस्तार संपत्ति के OutputStreamWriterरूप में अच्छी तरह से प्राप्त करने के लिए है :r.outputStream.writer.use { ... }
डेमियन Wieczorek

3
useएक्सटेंशन को प्रदर्शित करने वाले संदर्भ डॉक्टर से लिंक करें: kotlinlang.org/docs/reference/…
जावरु

1
मैं बेहतर तरीके से बहु "उपयोग" कैसे कर सकता हूं? FileOutputStream(into).use { val mergingStream = BufferedOutputStream(it).use { } }
पिंडोनारेंको ओलेह

44

टीएल; डीआर: कोई विशेष वाक्यविन्यास, सिर्फ एक फ़ंक्शन

कोटलिन, जैसा कि जावा के विपरीत है, इसके लिए एक विशेष वाक्यविन्यास नहीं है। इसके बजाय, कोशिश-के साथ संसाधनों , मानक पुस्तकालय समारोह के रूप में पेश किया जाता है use

FileInputStream("filename").use { fis -> //or implicit `it`
   //use stream here
} 

useकार्यान्वयन

@InlineOnly
public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R {
    var closed = false
    try {
        return block(this)
    } catch (e: Exception) {
        closed = true
        try {
            this?.close()
        } catch (closeException: Exception) {
        }
        throw e
    } finally {
        if (!closed) {
            this?.close()
        }
    }
}

इस फ़ंक्शन को सभी Closeable?प्रकारों पर एक सामान्य विस्तार के रूप में परिभाषित किया गया है । Closeableजावा का इंटरफ़ेस है जो जावा SE7 के रूप में कोशिश-के-संसाधनों की अनुमति देता है । फ़ंक्शन एक फ़ंक्शन शाब्दिक लेता है जिसे ए में निष्पादित किया जाता है । जावा में ट्राय -विथ-रिसोर्सेस के साथ ही , बंद हो जाता है ।
blocktryCloseablefinally

इसके अलावा असफलताओं blockको closeअंजाम देने के लिए नेतृत्व किया जा रहा है , जहां संभवत: अपवादों को केवल उन्हें अनदेखा करके "दबा" दिया जाता है। यह कोशिश-के-संसाधनों से अलग है , क्योंकि जावा के समाधान में ऐसे अपवादों का अनुरोध किया जा सकता है ।

इसे कैसे उपयोग करे

useविस्तार से किसी पर उपलब्ध है Closeableपाठकों और इतने पर, यानी धाराओं, टाइप।

FileInputStream("filename").use {
   //use your stream by referring to `it` or explicitly give a name.
} 

घुंघराले ब्रैकेट में जो हिस्सा है, वह बन जाता blockहै use(एक लंबो को यहां एक तर्क के रूप में पारित किया जाता है)। ब्लॉक किए जाने के बाद, आप सुनिश्चित कर सकते हैं कि FileInputStreamबंद कर दिया गया है।


16

संपादित करें : कोटलिन 1.0.x के लिए निम्नलिखित प्रतिक्रिया अभी भी मान्य है। कोटलिन 1.1 के लिए, एक मानक पुस्तकालय का समर्थन है जो बंद संसाधन संसाधन पैटर्न का समर्थन करने के लिए जावा 8 को लक्षित करता है।

अन्य वर्गों के लिए जो "उपयोग" फ़ंक्शन का समर्थन नहीं करते हैं, मैंने निम्नलिखित होममेड प्रयास-साथ-संसाधन किए हैं:

package info.macias.kotlin

inline fun <T:AutoCloseable,R> trywr(closeable: T, block: (T) -> R): R {
    try {
        return block(closeable);
    } finally {
        closeable.close()
    }
}

तो आप इसे निम्न तरीके से उपयोग कर सकते हैं:

fun countEvents(sc: EventSearchCriteria?): Long {
    return trywr(connection.prepareStatement("SELECT COUNT(*) FROM event")) {
        var rs = it.executeQuery()
        rs.next()
        rs.getLong(1)
    }
}

1
यह अंतत: खंड से फेंके गए अपवादों के साथ ठीक से व्यवहार नहीं करता है, जो कि उन कारणों में से एक है जिनके साथ-साथ संसाधनों को जावा में जोड़ा गया था। यह सिर्फ एक साधारण try/finallyब्लॉक है
निकोला मिहाजलोविस

0

चूंकि यह स्टैकऑवरफ़्लो पोस्ट "कोटलिन क्लोजेबल उदाहरण" के लिए वर्तमान खोज परिणामों में सबसे ऊपर है, और अभी तक कोई भी अन्य उत्तर (न ही आधिकारिक डॉक्स) स्पष्ट रूप से समझाता है कि कैसे Closeable(उर्फ java.io.Closeable) का विस्तार किया जाए , मैंने सोचा कि मैं एक उदाहरण जोड़ूंगा कैसे अपनी खुद की कक्षा बनाने के लिए जो फैली हुई है Closeable। यह इस प्रकार चलता है:

import java.io.Closeable

class MyServer : Closeable {
    override fun close() {
        println("hello world")
    }
}

और फिर इसका उपयोग करने के लिए:

fun main() {
    val s = MyServer()
    s.use {
        println("begin")
    }
    println("end")
}

इस उदाहरण को कोटलिन प्ले ग्राउंड में यहां देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.