在Scala中将InputStream转换为String的惯用法

bba*_*ant 104 string scala inputstream

我有一个方便的函数,我在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
  }
Run Code Online (Sandbox Code Playgroud)

在scala中有没有惯用的方法呢?

Rex*_*err 181

对于Scala> = 2.11

scala.io.Source.fromInputStream(is).mkString
Run Code Online (Sandbox Code Playgroud)

对于Scala <2.11:

scala.io.Source.fromInputStream(is).getLines().mkString("\n")
Run Code Online (Sandbox Code Playgroud)

几乎完全相同的事情.不知道为什么你想要获得线条,然后将它们全部粘合在一起.如果你可以假设流的非阻塞,你可以使用.available,将整个事物读入一个字节数组,并直接从中创建一个字符串.

  • 我自己使用的一个可能的原因是规范化不同操作系统上的行结尾. (2认同)

小智 73

Source.fromInputStream(is).mkString("") 也会做这件事......

  • +1`Source.fromInputStream(是).mkString`也适合我. (15认同)
  • 在执行此类操作时,通常还应指定字符编码.为此:`Source.fromInputStream(is)(Codec.UTF8).mkString` (8认同)
  • @ jaco0646 - 它不会关闭流.我刚刚测试过.以下是演示代码,证明了它:https://gist.github.com/RichardBradley/bcd1a5e61fcc83e4e59f8b9b0bc2301c (2认同)

Kam*_*nek 12

更快的方法:

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

  • 只需跳过第一行,然后将`inputStreamReader`传递给方法. (3认同)
  • 美丽.一直在努力寻找一个优雅的解决方案,从"Runtime.exec()"读取大量输入.这钉了它. (2认同)