Идиоматический способ преобразования InputStream в строку в Scala
У меня есть удобная функция, которую я использовал в Java для преобразования InputStream в String. Вот прямой перевод на Scala:
def inputStreamToString(is: InputStream) = {
val rd: BufferedReader = new BufferedReader(new InputStreamReader(is, "UTF-8"))
val builder = new StringBuilder()
try {
var line = rd.readLine
while (line != null) {
builder.append(line + "\n")
line = rd.readLine
}
} finally {
rd.close
}
builder.toString
}
Есть ли идиоматический способ сделать это в scala?
Ответы
Ответ 1
Для Scala >= 2.11
scala.io.Source.fromInputStream(is).mkString
Для Scala < 2,11:
scala.io.Source.fromInputStream(is).getLines().mkString("\n")
делает в значительной степени то же самое. Не уверен, почему вы хотите получить линии, а затем склеить их все вместе. Если вы можете принять поток без блокировки, вы можете просто использовать .available
, прочитать все это в байтовый массив и создать строку из этого напрямую.
Ответ 2
Source.fromInputStream(is).mkString("")
также будет делать дело.....
Ответ 3
Более быстрый способ сделать это:
private def inputStreamToString(is: InputStream) = {
val inputStreamReader = new InputStreamReader(is)
val bufferedReader = new BufferedReader(inputStreamReader)
Iterator continually bufferedReader.readLine takeWhile (_ != null) mkString
}