java - 如何写入 Nashorn 错误流?

标签 java stream javax.script

我使用来自 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/

相关文章:

Java 错误 : Comparison method violates its general contract

Java OBJECT 到 JSONObject

C# BinaryReader 无法访问已关闭的文件

Java,将文件流转换为随机访问文件

java - 类型错误 : Cannot find function getElementById in object

java - 尝试使用 Rhino,getEngineByName ("JavaScript")在 OpenJDK 7 中返回 null

java - 如何读取Android崩溃日志?

Java - 将目录中的文件读取到HashMap - 递归

c# - 模拟 Networkstream.Read

ios - SwfUpload Flash uploader 在 IOS 中不可见且无法工作