Java8Nashorn-将engine.eval(“print(';hello world';”)捕获到字符串对象中?

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')");

有没有一种方法可以在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')");

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将为您提供该字符串)