2009-10-07 4 views
13

Интересно, можно ли каким-либо образом изменить вывод по умолчанию (System.out) для groovy-скрипта, который я выполняю из своего Java-кода.Как перенаправить вывод из скрипта Groovy?

Вот код Java:

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

И образец заводной сценария:

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

В настоящее время выполнение метода, оценивает сценарии, пишет "Hello World!" на консоль (System.out). Как я могу перенаправить вывод на OutputStream, переданный как параметр?

ответ

16

Попробуйте это с помощью 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); 
} 

После комментариев

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 Script

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

Это будет работать, но я бы хотел перенаправить * любой * вывод, записанный на стандартный вывод. Особенно по встроенным функциям такой нам println(). –

+0

Вы были * о * праве. Решение состоит в том, чтобы обернуть вывод int java.io.PrintStream и передать свойство «out» оболочке! –

+0

yay !, мой первый бронзовый значок! Счастлив, что это работает! Как вы завершили вывод? – jjchiw

2

Я подозреваю, что вы могли бы сделать это довольно красиво, переписав метод println в metaClass GroovyShell. Следующие работы в 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'") 
Смежные вопросы