2013-07-21 2 views
4

Java 프로그램에서 groff을 실행하고 싶습니다. 입력은 문자열에서옵니다. 실제 명령 행에서는 Linux/Mac에서 ^D으로 입력을 종료합니다. 그렇다면 Java 프로그램에서이 터미네이터를 보내는 방법은 무엇입니까?EOF를 Java 프로세스로 보내는 방법은 무엇입니까?

String usage += 
    ".Dd \\[year]\n"+ 
    ".Dt test 1\n"+ 
    ".Os\n"+ 
    ".Sh test\n"+ 
    "^D\n"; // <--- EOF here? 
Process groff = Runtime.getRuntime().exec("groff -mandoc -T ascii -"); 
groff.getOutputStream().write(usage.getBytes()); 
byte[] buffer = new byte[1024]; 
groff.getInputStream().read(buffer); 
String s = new String(buffer); 
System.out.println(s); 

또는 다른 생각이 있으십니까?

답변

4

^D은 (는) 문자가 아닙니다. 쉘이 프로세스에 대한 스트림을 닫으라고 명령하는 명령입니다 (따라서 프로세스는 stdin에 EOF를받습니다).

코드에서 동일한 작업을 수행해야합니다. 플러시 닫습니다 OutputStream :

나는이 유틸리티 메소드 쓴
String usage = 
    ".Dd \\[year]\n" + 
    ".Dt test 1\n" + 
    ".Os\n" + 
    ".Sh test\n"; 
... 
OutputStream out = groff.getOutputStream(); 
out.write(usage.getBytes()); 
out.close(); 
... 
+0

당신이 http://stackoverflow.com/q/43051640/2674303 도움을 줄 수 있습니까? – gstackoverflow

0

:

public static String pipe(String str, String command2) throws IOException, InterruptedException { 
    Process p2 = Runtime.getRuntime().exec(command2); 
    OutputStream out = p2.getOutputStream(); 
    out.write(str.getBytes()); 
    out.close(); 
    p2.waitFor(); 
    BufferedReader reader 
      = new BufferedReader(new InputStreamReader(p2.getInputStream())); 
    StringBuilder sb = new StringBuilder(); 
    String line; 
    while ((line = reader.readLine()) != null) { 
     sb.append(line + "\n"); 
    } 
    return sb.toString(); 
} 
관련 문제