Идиоматический способ преобразования InputStream в строку в Scala - PullRequest
99 голосов
/ 07 марта 2011

У меня есть удобная функция, которую я использовал в Java для преобразования InputStream в строку.Вот прямой перевод на 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?

Ответы [ 3 ]

174 голосов
/ 07 марта 2011

Для Scala> = 2.11

scala.io.Source.fromInputStream(is).mkString

Для Scala <2.11: </p>

scala.io.Source.fromInputStream(is).getLines().mkString("\n")

делает почти то же самое.Не уверен, почему вы хотите получить строки, а затем склеить их все вместе.Если вы можете предположить неблокирование потока, вы можете просто использовать .available, прочитать все это в байтовом массиве и напрямую создать строку из этого.

73 голосов
/ 07 марта 2011

Source.fromInputStream(is).mkString("") также сделаю дело .....

12 голосов
/ 01 августа 2013

Более быстрый способ сделать это:

    private def inputStreamToString(is: InputStream) = {
        val inputStreamReader = new InputStreamReader(is)
        val bufferedReader = new BufferedReader(inputStreamReader)
        Iterator continually bufferedReader.readLine takeWhile (_ != null) mkString
    }
...