102 votes

Idiomatiques moyen de convertir un InputStream à une Chaîne en Scala

J'ai une fonction très pratique que j'ai utilisé en Java pour la conversion d'un InputStream à une Chaîne. Ici est une traduction directe de la 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
  }

Est-il un idiomatiques moyen de le faire dans scala?

179voto

Rex Kerr Points 94401
scala.io.Source.fromInputStream(is).getLines().mkString("\n")

fait à peu près la même chose. Pas sûr de savoir pourquoi vous souhaitez obtenir des lignes, puis colle-les tous ensemble, cependant. Si vous pouvez supposer que le flux est non bloquante, vous pouvez simplement utiliser .available, lire le tout dans un tableau d'octets, et de créer une chaîne de que directement.

Edit: 2.11, une performance d'un bug avec mkString sur Source a été fixé, alors maintenant, c'est juste

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

73voto

raam Points 621

Source.fromInputStream(is).mkString("") va aussi faire l'acte.....

12voto

squixy Points 1146

Moyen plus rapide pour ce faire:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X