2014-11-28 2 views
0

루아 스크립트를 사용하여 프로그램의 특정 영역으로 출력 할 내용을 결정하는 Java 프로그램을 작성하고 있습니다. 현재, 내 코드는 같은 같습니다루아에서 인쇄 전화 받기

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

문제는 tojstring()를 호출하면 루아 스크립트에서 return 값을 반환하는 표시이다. 괜찮 으면,하지만 print 전화를 받아야합니다. 그게 화면에 표시 될 것입니다. 지금은 print 전화가 콘솔로 직접 보내지고 (콘솔로 인쇄 됨) 이러한 인쇄 호출을 검색하는 방법을 알 수 없습니다.

설명서를 파헤 치려고했지만 거의 성공하지 못했습니다. 필요한 경우 LuaJ에서 변경됩니다.

답변

1

실제로 globals 개체의 변수 STDOUT을 임시 파일로 변경 한 다음 임시 파일에서 데이터를 읽음으로써 문제를 해결할 수있었습니다.

아마도 최상의 솔루션은 아니지만 완벽하게 작동합니다.

0

조셉 보일 (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")); 
    }