2011-08-28 33 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'。 –