2011-08-28 131 views
39

我一直以为Predef.println只是System.out.println的一个快捷键,但显然我误会了,因为它似乎根本没有使用System.out。为什么?我该如何在Scala中执行下面的“重定向”System.outprintln vs scala的System.out.println

scala> val baos = new java.io.ByteArrayOutputStream 
baos: java.io.ByteArrayOutputStream = 

scala> val ps = new java.io.PrintStream(baos) 
ps: java.io.PrintStream = [email protected] 

scala> System.setOut(ps) 

scala> println("hello") 
hello 

scala> new String(baos.toByteArray) 
res2: java.lang.String = "" 

scala> System.out.println("hello") 

scala> new String(baos.toByteArray) 
res7: java.lang.String = 
"hello 
" 
+2

查看https://issues.scala-lang.org/browse/SI-4793。 – huynhjl

回答

34

Predef.printlnConsole.println快捷方式,你可以使用Console.setOutConsole.withOut重定向。

另外,Console.setOut仅影响当前线程,而System.setOut 影响整个JVM。此外,Scala 2.9 repl在其自己的线程中评估每行,因此Console.setOut在那里不可用。

scala> val baos = new java.io.ByteArrayOutputStream 
baos: java.io.ByteArrayOutputStream = 

scala> Console.withOut(baos)(print("hello")) 

scala> println(baos) 
hello 
+10

'没有'听起来有点不对,即使是大O也不能治愈它。 :) –

+0

@userunknown同意。更糟糕的是,甚至有一个'Console.withIn'。 –