我使用来自 Java 应用程序的 Nashorn 脚本。 Java 设置上下文(包括 errorWriter)并且一切正常...... 但是我还没有找到从 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
);
之所以这样做,而不是直接绑定(bind)错误编写器对象,是因为您以后仍然可以更改错误编写器,它仍然可以工作。
之后你可以这样做:
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
关于java - 如何写入 Nashorn 错误流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39578020/