2009-10-07 77 views
13

Tôi tự hỏi nếu có cách nào tôi có thể thay đổi đầu ra mặc định (System.out) cho kịch bản lệnh groovy mà tôi đang thực thi từ mã Java của mình.Làm cách nào để chuyển hướng đầu ra từ tập lệnh Groovy?

Đây là mã Java:

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

Và mẫu kịch bản hấp dẫn:

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

Hiện nay việc thực hiện các phương pháp, đánh giá các kịch bản mà viết "Hello World!" vào bảng điều khiển (System.out). Làm cách nào để chuyển hướng đầu ra tới OutputStream được truyền dưới dạng tham số?

Trả lời

16

Hãy thử này sử dụng 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); 
} 

Sau comments

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

Điều đó có hiệu quả, nhưng tôi muốn chuyển hướng * bất kỳ * đầu ra nào được ghi vào đầu ra tiêu chuẩn. Đặc biệt là các hàm dựng sẵn như println(). –

+0

Bạn đã * về * đúng. Giải pháp là bọc đầu ra vào java.io.PrintStream và chuyển thành thuộc tính "out" cho shell! –

+0

yay !, huy hiệu đồng đầu tiên của tôi! Chúc mừng nó hoạt động! Làm thế nào bạn quấn đầu ra? – jjchiw

2

Tôi nghi ngờ bạn có thể làm điều này khá độc đáo bằng cách ghi đè phương thức println trong metaClass của GroovyShell của bạn. Các công trình sau đây trong Groovy Console:

StringBuilder b = new StringBuilder() 

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

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

đầu ra:

Hello, world! 
Hello, world! 
2

Sử dụng SystemOutputInterceptor lớp. Bạn có thể bắt đầu chặn đầu ra trước khi đánh giá kịch bản và dừng lại sau.

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

Cách sử dụng javax.script.ScriptEngine? Bạn có thể chỉ định người viết của nó.

ScriptEngine engine = new ScriptEngineManager().getEngineByName("Groovy"); 
PrintWriter writer = new PrintWriter(new StringWriter()); 
engine.getContext().setWriter(writer); 
engine.getContext().setErrorWriter(writer); 
engine.eval("println 'HELLO'") 
Các vấn đề liên quan