2009-10-07 13 views
13

Me pregunto si hay alguna manera de poder cambiar la salida predeterminada (System.out) para la secuencia de comandos groovy que estoy ejecutando desde mi código de Java.¿Cómo redirigir la salida de la secuencia de comandos de Groovy?

Aquí está el código de Java:

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

Y el script de ejemplo maravilloso:

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

Actualmente la ejecución del método, evalúa los guiones que escribe "Hello World!" a la consola (System.out). ¿Cómo puedo redireccionar la salida al OutputStream pasado como parámetro?

Respuesta

16

probar este usando Binding

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); 
} 

Después comentarios

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); 
} 

maravillosa escritura

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

Eso funcionaría, pero me gustaría redirigir * cualquier * salida escrita en la salida estándar. Especialmente por funciones incorporadas tales como println(). –

+0

Estabas * a * la derecha. La solución es envolver la salida int java.io.PrintStream y pasar como propiedad "out" al shell. –

+0

yay !, ¡mi primera placa de bronce! ¡Feliz que funciona! ¿Cómo envolvió la salida? – jjchiw

2

Sospecho que podría hacer esto muy bien sobrescribiendo el método println en su metaClass de GroovyShell. Las siguientes obras en Groovy Consola:

StringBuilder b = new StringBuilder() 

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

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

de salida:

Hello, world! 
Hello, world! 
2

Uso SystemOutputInterceptor clase. Puede comenzar a interceptar la salida antes de la evaluación del script y detenerse después.

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

¿Qué le parece usar javax.script.ScriptEngine? Puede especificar su escritor.

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