如何将文件读入InputStream,然后将其写入Scala中的OutputStream?

Mau*_*res 18 java integration scala inputstream outputstream

我正在尝试使用Scala中的基本Java代码从文件中读取并写入OutputStream,但是当我在Scala中使用通常的while(!= -1)时,会给出一个警告"比较Unit和Int的类型! =总是会产生真实的".

代码如下:

    val file = this.cache.get(imageFileEntry).getValue().asInstanceOf[File]
    response.setContentType( "image/%s".format( imageDescription.getFormat() ) )

    val input = new BufferedInputStream( new FileInputStream( file ) )
    val output = response.getOutputStream()

    var read : Int = -1

    while ( ( read = input.read ) != -1 ) {
        output.write( read )
    }

    input.close()
    output.flush()
Run Code Online (Sandbox Code Playgroud)

我应该如何从输入流写入Scala中的输出流?

我最感兴趣的是类似Scala的解决方案.

Dan*_*ral 41

你可以这样做:

Iterator 
.continually (input.read)
.takeWhile (-1 !=)
.foreach (output.write)
Run Code Online (Sandbox Code Playgroud)

  • 好的,这看起来像一个真正的 Scala 解决方案,但是这个**连续**调用会将文件加载到内存中,还是会在 foreach 循环运行时调用此函数?另外,您能详细说明一下这个 takeWhile 方法吗?为什么不必使用 _ 参数或自己定义参数? (2认同)

Yar*_*lav 17

如果这很慢:

Iterator 
.continually (input.read)
.takeWhile (-1 !=)
.foreach (output.write)
Run Code Online (Sandbox Code Playgroud)

你可以扩展它:

val bytes = new Array[Byte](1024) //1024 bytes - Buffer size
Iterator
.continually (input.read(bytes))
.takeWhile (-1 !=)
.foreach (read=>output.write(bytes,0,read))
output.close()
Run Code Online (Sandbox Code Playgroud)


Kim*_*bel 7

赋值语句总是在Scala中read = input.read返回Unit,因此返回Unit,它永远不等于-1.你可以这样做:

while ({read = input.read; read != -1}) {
  output.write(read)
}
Run Code Online (Sandbox Code Playgroud)


Knu*_*daa 5

def stream(inputStream: InputStream, outputStream: OutputStream) =
{
  val buffer = new Array[Byte](16384)

  def doStream(total: Int = 0): Int = {
    val n = inputStream.read(buffer)
    if (n == -1)
      total
    else {
      outputStream.write(buffer, 0, n)
      doStream(total + n)
    }
  }

  doStream()
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个更好的解决方案。上述解决方案非常慢。每字节读取一次调用的开销?真的吗?这在批量数据移动设备中如何可接受? (2认同)