Java8Nashorn-将engine.eval(“print(';hello world';”)捕获到字符串对象中?
有没有一种方法可以在Nashorn中捕获print(“hello world”)的结果并将其放置在String对象中 我试过这个:Java8Nashorn-将engine.eval(“print(';hello world';”)捕获到字符串对象中?,java,java-8,nashorn,Java,Java 8,Nashorn,有没有一种方法可以在Nashorn中捕获print(“hello world”)的结果并将其放置在String对象中 我试过这个: ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos, true); System.setOut(ps); String result = (String)engine.eval("print('hello world')");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos, true);
System.setOut(ps);
String result = (String)engine.eval("print('hello world')");
if (result != null) {
System.out.println(result);
} else {
System.out.println(baos.toString());
}
当引擎计算这个javascript时,它只是打印到stdout,所以我想我只是将stdout重定向到我自己的OutputStream,然后将其转换为字符串,但它不起作用
有什么想法吗 我怀疑问题出在:
if (result != null)
对print(…)
语句进行求值,仍然会得到print
的返回值,该值可能是未定义的。但我的猜测是,您在baos
中仍然有正确的内容,如果您将语句更改为if(false)
,它将按预期工作
这就是说,这可能不是最好的方法,这取决于您正在尝试执行的操作。您正在设置系统。out
流,在创建引擎之后,因此很可能引擎的上下文已经在构建时记录了系统。out
/系统。err
因此,您仍然可以在控制台上看到脚本的输出。更糟糕的是,您将System.out.println
重定向到您的ByteArrayOutputStream
,以后就看不到自己的输出了
因此,不要修改System.out
,而是在脚本引擎引擎的上下文中更改输出。
stringWriter)
完整代码:
StringWriter sw=new StringWriter();
engine.getContext().setWriter(sw);
String result = (String)engine.eval("print('hello world')");
System.out.println("Result returned by eval(): "+result);
System.out.println("Captured output: "+sw);
您不想强制转换eval结果-这将是JS未定义的值。为当前ScriptContext设置Writer实例后,将评估通过打印写入的代码。然后从Writer实例中提取累积的字符串。(StringWriter的toString将为您提供该字符串)