2016-09-19 72 views
3

我使用來自Java應用程序的Nashorn腳本。 Java設置上下文(包括errorWriter)和一切正常工作... 但我還沒有找到方式來寫入從nashorn腳本的錯誤流。有人知道嗎 ?如何寫入Nashorn錯誤流?

我試圖拋出一個錯誤,但它在scriptException中輸出,而不是在錯誤輸出流中。

謝謝你的任何想法。

回答

1

It looks like沒有內置函數寫入stderr,就像有一個寫入stdoutprint)。

但是,您可以在ScriptContext中設置一個屬性,該屬性具有寫入其錯誤編寫器的函數。

ScriptEngine se = ...; 

ScriptContext sc = se.getContext(); 
sc.setAttribute("stderr", // name is 'stderr' 
    (Consumer<String>) str -> { // Object is a Consumer<String> 
     try { 
      Writer err = sc.getErrorWriter(); 
      err.write(str); 
      err.flush(); 
     } catch (Exception e) { 
      throw new Error(e); 
     } 
    }, 
    ScriptContext.ENGINE_SCOPE // i.e. don't share with other engines 
); 

之所以做這種方式,而不是直接綁定錯誤作家的對象,是你仍然可以在以後更改錯誤的作家,它仍然可以工作。

之後,你可以這樣做:

sc.setErrorWriter(new PrintWriter(new OutputStream() {   
    @Override 
    public void write(int b) throws IOException { 
     System.err.write(b);     
    } 
})); 

哪會寫所有的錯誤到Java stderr(這不是BTW默認值)。

然後從JavaScript,你可以這樣做:

var error = function(message) { // A nice wrapper function 
    stderr.accept(message); // 'accept', since we passed a `Consumer<...>` 
}; 

error('error'); // Will now print to Java's stderr 
+0

明確的答案,謝謝 – xaevus