3

我使用来自 Java 应用程序的 Nashorn 脚本。Java设置上下文(包括errorWriter)并且一切正常......但是我还没有找到从nashorn脚本写入错误流的方法。有人知道吗 ?

我试图抛出一个错误,但它在 scriptException 中输出,而不是在错误输出 Stream 中。

感谢您的任何想法。

4

1 回答 1

4

看起来没有内置函数可以写入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
于 2016-09-19T18:02:18.910 回答