0

我正在使用 javax.script API 执行 kotlin 脚本。我想捕获输出并稍后打印日志。

我可以为 nashorn 脚本引擎做到这一点,但同样不适用于 KotlinScriptEngine。

    public void testExampleNashorn() throws ScriptException {
        ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
        ScriptContext context = engine.getContext();
        StringWriter writer = new StringWriter();
        context.setWriter(writer);

        engine.eval("print(\"Welocme to java worldddd\")");

        String output = writer.toString();

        System.out.println("Script output: " + output);
    }

Nashorn 的输出

Script output: Welocme to java worldddd

为 kotlin 调整时的相同代码片段如下

    public void testExampleKotlin() throws ScriptException {
        ScriptEngine engine = new ScriptEngineManager().getEngineByName("kotlin");
        ScriptContext context = engine.getContext();
        StringWriter writer = new StringWriter();
        context.setWriter(writer);

        engine.eval("println(\"Welocme to java worldddd\")");

        String output = writer.toString();

        System.out.println("Script output: " + output);
    }

kotlin 的输出

Welocme to java worldddd
Script output: 
null

我正在使用 kotlin 版本 1.3.72 非常感谢任何帮助。谢谢。

4

1 回答 1

1

这就是我设法捕获 KotlinScriptEngine 执行日志的方法。

public Object captureOut(String script,Bindings bindings)  {
        Object result=null;
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        PrintStream ps = new PrintStream(os);
        PrintStream console = System.out;
        System.setOut(ps);

        try {
            result = kotlinScriptingEngine.eval(script,bindings);
        } catch (ScriptException scriptException) {
            scriptException.printStackTrace(ps);
        }  finally {
            System.out.flush();
            System.setOut(console);
        }
        System.out.println("Kotlin Script Output: " + os.toString());
        return result;
}
于 2020-06-05T11:37:34.663 回答