web-dev-qa-db-ja.com

ScalaでInputStreamを文字列に変換する慣用的な方法

InputStreamをStringに変換するためにJavaで使用した便利な関数があります。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でこれを行う慣用的な方法はありますか?

101
bballant

Scala> = 2.11

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

Scala <2.11:

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

ほぼ同じことを行います。ただし、なぜラインを取得し、それらをすべて一緒に戻したいのかはわかりません。ストリームの非ブロッキングを想定できる場合は、.available、すべてをバイト配列に読み込み、そこから文字列を直接作成します。

176
Rex Kerr

Source.fromInputStream(is).mkString("")も行為を行います.....

73
raam

これを行うより速い方法:

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