3
我使用來自Java應用程序的Nashorn腳本。 Java設置上下文(包括errorWriter)和一切正常工作... 但我還沒有找到方式來寫入從nashorn腳本的錯誤流。有人知道嗎 ?如何寫入Nashorn錯誤流?
我試圖拋出一個錯誤,但它在scriptException中輸出,而不是在錯誤輸出流中。
謝謝你的任何想法。
我使用來自Java應用程序的Nashorn腳本。 Java設置上下文(包括errorWriter)和一切正常工作... 但我還沒有找到方式來寫入從nashorn腳本的錯誤流。有人知道嗎 ?如何寫入Nashorn錯誤流?
我試圖拋出一個錯誤,但它在scriptException中輸出,而不是在錯誤輸出流中。
謝謝你的任何想法。
It looks like沒有內置函數寫入stderr
,就像有一個寫入stdout
(print
)。
但是,您可以在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
明確的答案,謝謝 – xaevus