Niedawno widziałem kod do wczytywania całej zawartości an InputStream
into a String w Kotlinie, taki jak:
// input is of type InputStream
val baos = ByteArrayOutputStream()
input.use { it.copyTo(baos) }
val inputAsString = baos.toString()
I również:
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()
}
I nawet to wygląda płynniej, ponieważ automatycznie zamyka InputStream
:
val inputString = BufferedReader(InputStreamReader(input)).useLines { lines ->
val results = StringBuilder()
lines.forEach { results.append(it) }
results.toString()
}
Lub niewielka zmiana tego:
val results = StringBuilder()
BufferedReader(InputStreamReader(input)).forEachLine { results.append(it) }
val resultsAsString = results.toString()
Następnie ten funkcjonalny skład:
val inputString = input.bufferedReader().useLines { lines ->
lines.fold(StringBuilder()) { buff, line -> buff.append(line) }.toString()
}
Lub zła odmiana, która nie zamyka InputStream
:
val inputString = BufferedReader(InputStreamReader(input))
.lineSequence()
.fold(StringBuilder()) { buff, line -> buff.append(line) }
.toString()
Ale wszystkie są niezgrabne i ciągle znajduję nowsze i różne wersje tego samego ... a niektóre z nich nawet nie zamykają InputStream
. Jaki jest niezgrabny (idiomatyczny) sposób czytania InputStream
?
Uwaga: to pytanie jest celowo napisany i odpowiedział przez autora ( Self-odpowiedziało na pytania ), tak że idiomatyczne odpowiedzi na najczęściej zadawane tematy Kotlin są obecne w tak.
źródło
use
lub,useLines
która wykonuje funkcję blokową na tym, co jest „używane”. npinputStream.useText { text -> ... }
Z drugiej strony, kiedy czytam „READTEXT” Spodziewam funkcję, która zwraca tekst:val inputAsString = inputStream.readText()
.use
funkcje w tym względzie. przynajmniej w kontekście tego pytania i odpowiedzi. może można znaleźć nowy czasownik ...readTextAndClose()
tym przykładzie wybrałem, aby uniknąć konfliktów zreadText()
wzorcami niezamykania iz wzorami wymagającymiuse
lambdy, ponieważ nie próbuję wprowadzać nowej funkcji standardowej biblioteki, nie chcę robić nic więcej niż tylko zwrócić uwagę na użycie rozszerzenia, aby zaoszczędzić przyszłą siłę roboczą.Przykład odczytujący zawartość InputStream do String
Dla odniesienia - Kotlin Read File
źródło
Paths.get()
metody method. 2) Dla strumieni - funkcja try-resource (w kotlin: .use {})【Metoda 1 | Ręcznie zamknij strumień】
inputStream.readBytes()
wymaga ręcznego zamknięcia strumienia: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.io.-input-stream/read-bytes.html【Metoda 2 | Automatycznie zamknij strumień】
Możesz określić zestaw znaków w środku
bufferedReader()
, domyślnie jest toUTF-8
: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/java.io.-input-stream/buffered-reader.htmlbufferedReader()
jest uaktualnioną wersją programureader()
, jest bardziej wszechstronna: Jak dokładnie działa bufferedReader () w Kotlinie?use()
może automatycznie zamknąć strumień po zakończeniu blokady: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/use.htmlźródło