2011-08-28 5 views
39

나는 항상 Predef.printlnSystem.out.println의 바로 가기라고 생각했지만, 분명히 오해했습니다. System.out을 전혀 사용하지 않는 것 같습니다. 왜 이렇게이다? 그리고 아래 스칼라에서 System.out의 "리디렉션"을 어떻게 수행 할 수 있습니까?println 대 스칼라의 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.setOut 또는 Console.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'도 있습니다. –