在LuaJ中获取打印调用

我正在编写一个使用 Lua 脚本确定在程序的某些区域输出内容的 Java 程序。目前,我的代码如下:

Globals globals = JsePlatform.standardGlobals();
LuaValue chunk = globals.loadfile(dir.getAbsolutePath() + "/" + name);
chunk.call();
String output = chunk.tojstring();

问题是调用 tojstring() 似乎返回 Lua 脚本的 return 值。这没关系,但我需要获取 print 调用,因为那将显示在屏幕上。目前,print 调用直接发送到控制台(打印到控制台),而我无法找到一种检索这些打印调用的方法。

我尝试查阅文档,但成功不大。如有需要,可以从 LuaJ 进行更改。

点赞
用户2329661
用户2329661

我实际上通过将 globals 对象中的 STDOUT 变量更改为一个临时文件来解决了问题,然后从临时文件中读取数据。

可能不是最好的解决方案,但完全可以正常工作。

2014-11-29 04:06:07
用户350651
用户350651

扩展Joseph Boyle的答案(几年后):如果您喜欢,还可以将printStream设置为ByteArrayOutputStream(无需将其设置为磁盘上的文件)。我在使用LuaJ的JUnit测试中进行了这项工作:

@Test
  public void testPrintToStringFromLuaj() throws IOException {
    String PRINT_HELLO = "print (\"hello world\")";
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    PrintStream printStream = new PrintStream(baos, true, "utf-8");
    Globals globals = JsePlatform.standardGlobals();
    globals.STDOUT = printStream;
    LuaValue load = globals.load(PRINT_HELLO);
    load.call();
    String content = new String(baos.toByteArray(), StandardCharsets.UTF_8);
    printStream.close();
    assertThat(content, is("hello world\n"));
  }
2017-12-06 17:27:20