streamappender.scala

来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 91 行

SCALA
91
字号
/* NEST (New Scala Test) * Copyright 2007-2008 LAMP/EPFL * @author Philipp Haller */// $Id: StreamAppender.scala 14415 2008-03-19 00:53:09Z mihaylov $package scala.tools.partest.nestimport java.io.{Writer, PrintWriter, Reader, BufferedReader,                IOException, InputStream, StringWriter, InputStreamReader,                OutputStreamWriter, StringReader, OutputStream}object StreamAppender {  def apply(reader: BufferedReader, writer: Writer) = {    val pwriter = new PrintWriter(writer, true)    new StreamAppender(reader, pwriter)  }  def apply(reader: Reader, writer: Writer) = {    val bufReader = new BufferedReader(reader)    val pwriter = new PrintWriter(writer, true)    new StreamAppender(bufReader, pwriter)  }  def appendToString(in1: InputStream, in2: InputStream): String = {    val swriter1 = new StringWriter    val swriter2 = new StringWriter    val reader1 = new BufferedReader(new InputStreamReader(in1))    val reader2 = new BufferedReader(new InputStreamReader(in2))    val app1 = StreamAppender(reader1, swriter1)    val app2 = StreamAppender(reader2, swriter2)    val async = new Thread(app2)    async.start()    app1.run()    async.join()    swriter1.toString + swriter2.toString  }  def inParallel(t1: Runnable, t2: Runnable, t3: Runnable) {    val thr1 = new Thread(t1)    val thr2 = new Thread(t2)    thr1.start()    thr2.start()    t3.run()    thr1.join()    thr2.join()  }  def inParallel(t1: Runnable, t2: Runnable) {    val thr = new Thread(t2)    thr.start()    t1.run()    thr.join()  }  def concat(in: InputStream, err: InputStream, out: OutputStream) = new Runnable {    override def run() {      val outWriter = new PrintWriter(new OutputStreamWriter(out), true)      val inApp = new StreamAppender(new BufferedReader(new InputStreamReader(in)),                                     outWriter)      val errStringWriter = new StringWriter      val errApp = StreamAppender(new BufferedReader(new InputStreamReader(err)),                                  errStringWriter)      inParallel(inApp, errApp)      // append error string to out      val errStrApp = new StreamAppender(new BufferedReader(new StringReader(errStringWriter.toString)),                                         outWriter)      errStrApp.run()    }  }}class StreamAppender(reader: BufferedReader, writer: PrintWriter) extends Runnable {  override def run() = runAndMap(identity)  def runAndMap(f:String=>String): Unit = {    try {      var line = reader.readLine()      while (line != null) {        writer.println(f(line))        line = reader.readLine()      }    } catch {      case e: IOException =>        e.printStackTrace()    }  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?