2014-11-28 3 views
0

Я пишу программу Java, которая использует сценарии Lua, чтобы определить, что выводить в определенные области программы. В настоящее время мой код выглядит так:Получение вызовов печати в LuaJ

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

Проблема заключается в том, что вызов tojstring() появляется вернуть return значения из сценария Lua. Это нормально, но мне нужно получить вызовы print, так как это будет отображаться на экране. На данный момент звонки print отправляются непосредственно на консоль (печатаются на консоль), и я не могу найти способ получить эти вызовы печати.

Я пробовал прорыть документацию, но имел небольшой успех. При необходимости изменится с LuaJ.

ответ

1

Я действительно смог решить проблему, изменив переменную STDOUT в объекте globals во временный файл, а затем прочитав данные из временного файла.

Возможно, это не лучшее решение, но работает отлично.

0

Расширение ответа Джозефа Бойля (несколько лет спустя): вы также можете настроить printStream на ByteArrayOutputStream (нет необходимости делать это с файлом на диске), если это ваш яд. Я сделал это в тесте JUnit с LuaJ, и он работает:

@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")); 
    } 
Смежные вопросы