2009-10-07 5 views
13

Javaコードから実行しているGroovyスクリプトのデフォルト出力(System.out)を変更できる方法があるのだろうかと思います。Groovyスクリプトの出力をどのようにリダイレクトするのですか?

public void exec(File file, OutputStream output) throws Exception { 
    GroovyShell shell = new GroovyShell(); 
    shell.evaluate(file); 
} 

とサンプルのGroovyスクリプト:ここ

は、Javaコードで現在

def name='World' 
println "Hello $name!" 

メソッドの実行、書き込み、スクリプトの評価に "Hello World!" というコンソール(System.out)に転送します。出力をパラメータとして渡されたOutputStreamにリダイレクトするにはどうすればよいですか?

答えて

16

コメント

public void exec(File file, OutputStream output) throws Exception { 
    Binding binding = new Binding() 
    binding.setProperty("out", new PrintStream(output)) 
    GroovyShell shell = new GroovyShell(binding); 
    shell.evaluate(file); 
} 

のGroovyスクリプト

def name='World' 
out << "Hello $name!" 
+2

これはうまくいくでしょうが、標準出力に書き出された*出力をリダイレクトしたいと思います。特にprintln()のような組み込み関数によって。 –

+0

あなたは* about * rightだった。解決策は、出力をjava.io.PrintStreamにラップし、シェルに "out"プロパティとして渡すことです。 –

+0

よろしく!、私の最初の青銅バッジ! うれしいことです!どのように出力をラップしましたか? – jjchiw

0

http://java.sun.com/j2se/1.3/docs/api/java/lang/System.html#setOut%28java.io.PrintStream%29Binding

public void exec(File file, OutputStream output) throws Exception { 
    Binding binding = new Binding() 
    binding.setProperty("out", output) 
    GroovyShell shell = new GroovyShell(binding); 
    shell.evaluate(file); 
} 

を使用して、これを試してみてくださいあなたが必要とするだけのものです。

+0

私は恐ろしいSystem.setOutが重すぎます:)それはJVM全体の出力をグローバルに変更します。これは私がしたいことではありません:) –

2

私はGroovyShellのメタクラスでprintlnメソッドを上書きすることでこれをうまくやっていると思います。 Groovyのコンソールで、次の作品:

StringBuilder b = new StringBuilder() 

this.metaClass.println = { 
    b.append(it) 
    System.out.println it 
} 

println "Hello, world!" 
System.out.println b.toString() 

出力:

Hello, world! 
Hello, world! 
2

使用SystemOutputInterceptorクラス。スクリプト評価の前に出力を傍受してから停止することができます。

def output = ""; 
def interceptor = new SystemOutputInterceptor({ output += it; false}); 
interceptor.start() 
println("Hello") 
interceptor.stop() 
2

javax.script.ScriptEngineの使用はどうですか?ライターを指定することができます。

ScriptEngine engine = new ScriptEngineManager().getEngineByName("Groovy"); 
PrintWriter writer = new PrintWriter(new StringWriter()); 
engine.getContext().setWriter(writer); 
engine.getContext().setErrorWriter(writer); 
engine.eval("println 'HELLO'")