मैंने हाल ही InputStream
में कोटलिन में एक स्ट्रिंग की पूरी सामग्री को पढ़ने के लिए कोड देखा , जैसे:
// input is of type InputStream
val baos = ByteArrayOutputStream()
input.use { it.copyTo(baos) }
val inputAsString = baos.toString()
और भी:
val reader = BufferedReader(InputStreamReader(input))
try {
val results = StringBuilder()
while (true) {
val line = reader.readLine()
if (line == null) break
results.append(line)
}
val inputAsString = results.toString()
} finally {
reader.close()
}
और यह भी कि यह ऑटो बंद होने के बाद से चिकना दिखता है InputStream
:
val inputString = BufferedReader(InputStreamReader(input)).useLines { lines ->
val results = StringBuilder()
lines.forEach { results.append(it) }
results.toString()
}
या उस पर थोड़ा बदलाव:
val results = StringBuilder()
BufferedReader(InputStreamReader(input)).forEachLine { results.append(it) }
val resultsAsString = results.toString()
फिर यह कार्यात्मक गुना चीज़:
val inputString = input.bufferedReader().useLines { lines ->
lines.fold(StringBuilder()) { buff, line -> buff.append(line) }.toString()
}
या एक बुरी भिन्नता जो बंद नहीं होती है InputStream
:
val inputString = BufferedReader(InputStreamReader(input))
.lineSequence()
.fold(StringBuilder()) { buff, line -> buff.append(line) }
.toString()
लेकिन वे सभी क्लूनी हैं और मैं उसी के नए और अलग-अलग संस्करण खोजता रहता हूं ... और उनमें से कुछ कभी बंद भी नहीं होते हैं InputStream
। नॉन-क्लंकी (मुहावरेदार) तरीका क्या है पढ़ने के लिए InputStream
?
नोट: यह प्रश्न जानबूझकर लिखा गया है और लेखक द्वारा ( स्व-उत्तर वाले प्रश्न ) उत्तर दिया गया है , ताकि आमतौर पर पूछे जाने वाले कोटलिन विषयों के मुहावरेदार उत्तर एसओ में मौजूद हों।
use
याuseLines
जो क्या "पुराना" किया जा रहा है पर एक ब्लॉक समारोह निष्पादित करता है। उदाहरण केinputStream.useText { text -> ... }
लिए, जब मैं "readText" पढ़ता हूं, तो मैं एक ऐसे फ़ंक्शन की उम्मीद करता हूं जो पाठ को लौटाता हैval inputAsString = inputStream.readText()
:।