如何写入 Nashorn 错误流?
How to write to Nashorn error stream?
我使用来自 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
);
之所以这样做,而不是直接绑定错误编写器对象,是因为您以后仍然可以更改错误编写器,它仍然可以工作。
之后你可以这样做:
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 脚本。 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
);
之所以这样做,而不是直接绑定错误编写器对象,是因为您以后仍然可以更改错误编写器,它仍然可以工作。
之后你可以这样做:
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