2014-07-13 1 views
0

이 코드 사용의 .jar 내부의 .JAR을 시작하려고 해요 (나는 craftbukkit 서버에 노력하고 알 권리)시작과 .JAR의 출력 (예 : 마인 크래프트 Bukkit의 .JAR)를 얻을

Runtime rt = Runtime.getRuntime(); 
Process p = rt.exec("java -jar craft.jar"); 
BufferedReader out = new BufferedReader(new InputStreamReader(p.getInputStream())); 
BufferedWriter in = new BufferedWriter(new OutputStreamWriter(p.getOutputStream())); 
this.running = true; 

while(this.running){ 
String line; 
    if((line = out.readLine()) != null){ 
     System.out.println(line); 
    } 
} 

문제는 잠시 동안 작동하지만 잠시 후 출력이 중지되거나 아래 이미지와 같이 '>'로 인쇄됩니다. 이 문제를 어떻게 해결할 수 있습니까? ** 플러스, bukkit 서버에 명령을 보내는 올바른 방법은 무엇입니까?

An img of the error

감사합니다!

답변

1

Java에서 Process을 사용하는 경우 두 개의 독립 스레드 (while 루프)에서 stdout 및 stderr을 읽는 것이 중요합니다. 그렇지 않으면 채워진 버퍼가 소모 될 때까지 대기하는 자식 프로세스가 잠길 수 있습니다.

Java 7을 사용하면 stderr을 실제로 stdout으로 리디렉션하고 결과 스트림을 부모 stdout으로 리디렉션 할 수 있습니다. 이전 버전에서는 별도의 스레드를 연결해야합니다.

이외 : exec의 "단일 문자열"변형을 사용하지 말고 args를 배열로 지정해야합니다. 이것은보다 안전합니다 (구문 분석 문제에 덜 취약합니다).

(그러나 이것은 실제 문제가 있는지 확실하지 오전 아마 당신은 오류 스트림을 덤프해야하며 도움이되는지 확인합니다.) 나는 그런 식으로 그것을 할

0

을 :

@Override 
public void run(){ 
// ... 
BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream())); //of course proc is an instance of Process, and it's set up 
while(true){ 
    String line = stdInput.readLine(); 
    if(line == null) break; //this is essential, when process terminates, line gets null 
    System.out.println(">"+line); 
    } 
// ... 
} 

는 그것을주세요 시험. (기술적으로는 당신이 어떻게했는지는 비슷하지만 공유 할 수 있도록 작동합니다)