web-dev-qa-db-fra.com

Manière idiomatique de convertir un InputStream en String in Scala

J'ai une fonction pratique que j'ai utilisée dans Java pour convertir un InputStream en String. Voici une traduction directe en 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
  }

Existe-t-il un moyen idiomatique de faire cela en scala?

101
bballant

Pour Scala> = 2.11

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

Pour Scala <2.11:

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

fait à peu près la même chose. Vous ne savez pas pourquoi vous voulez obtenir des lignes et les recoller ensuite ensemble. Si vous pouvez supposer que le flux n'est pas bloquant, vous pouvez simplement utiliser .available, lisez le tout dans un tableau d'octets et créez directement une chaîne.

176
Rex Kerr

Source.fromInputStream(is).mkString("") fera également l'acte .....

73
raam

Manière plus rapide de faire ceci:

    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