2012-10-04 2 views
2

다음 코드를 사용하여 다른 곳에서 사용할 수 있도록 노력하고 있습니다.PrintWriter가 작동하지 않습니까?

효과적으로, 다른 프로세스를 시작하고, python을 실행하고, python에 몇 가지 명령을 제공합니다. 그러나, 실제로, 그 프로세스에 스트림을 닫지 않으면 파이썬 명령은 절대로 전송되지 않습니다. flush()가 강제로이 일이 발생한다고 생각했지만 작동하지 않는 것 같습니다. 아무도 flush()가 작동하지 않을 수 있으며이를 피하기 위해 무엇을 할 수 있는지에 대한 통찰력을 제공 할 수 있습니까? 감사.

close()를 호출하면 명령이 전송됩니다. 그러나,이 한 명령 다음에 더 많은 명령을 보낼 수 있기를 원합니다. 그래서 여기서 close()를 사용하는 것은 받아 들일 수없는 것처럼 보입니다. (I거야 결국 close()를 모든)

import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.util.Scanner; 

public class Foo { 
public static void main(String[] args) throws IOException { 
    Process cmd = Runtime.getRuntime().exec("python"); 

    InputStream inStream = cmd.getInputStream(); 
    Thread stdout = new Thread(new stdOutReader(inStream)); 
    stdout.start(); 

    InputStream errStream = cmd.getErrorStream(); 
    Thread stderr = new Thread(new stdOutReader(errStream)); 
    stderr.start(); 

    OutputStream outStream = cmd.getOutputStream(); 
    OutputStreamWriter os = new OutputStreamWriter(outStream); 
    PrintWriter pWriter = new PrintWriter(outStream, true); 
    pWriter.println("print \"Testing..\""); 

    pWriter.flush(); 
    int x = 0; 
    while (x < 100){ 
     //Do stuff here (will not be an infinite loop in actual code) 
    } 

    pWriter.close(); 

} 
private static class stdOutReader implements Runnable{ 
    InputStream inStream; 

    public stdOutReader(InputStream inStream){ 
     this.inStream = inStream; 
    } 

    public void run() { 
     InputStreamReader reader = new InputStreamReader(this.inStream); 
     Scanner scan = new Scanner(reader); 
     while (scan.hasNext()) { 
      System.out.println(scan.next()); 
      System.out.flush(); 
     } 
    } 
} 
} 
+0

코드를 검사하여 오류를 확인해 보셨습니까? 'PrintWriter'는 그것들을 숨 깁니다. 아마도 더 강력한 오류 처리 기능이있는 다른 IO 클래스를 사용하는 것을 고려해보십시오 (이유를 설명해주십시오.). – noahlz

+0

@noahz 무슨 뜻인지 모르겠습니다. 플러시 전후에 pWriter에 "checkError"호출을하면 false를 반환합니다. 예외를 던지기보다는 주에서 예외를 잡으면 아무 것도 잡지 못합니다. 나는 또한 "println"보다는 "write"를 사용하여 BufferedWrither를 시도 했으므로 다른 I/O 클래스를 사용하는 것에 반대하지는 않습니다. –

+0

인쇄가 괜찮아 보입니다. 아마도 마지막 토큰을 유지하고 앞을 읽는 스캐너 일 것입니다. 그냥 InputStream을 사용하여 행을 읽으십시오. 프로세스 사용에 관한 모든 것을 올바르게 얻는 것은 어렵습니다. –

답변

0

Apache Commons Executor를 사용하는 대신 직접 Runtime.exec() API를 사용하는 것이 좋습니다.

+0

나는 이것을 시도해 보았지만 차이를 만들지는 않았다. 즉, 내가이 코드를 사용했을 때 제대로 입력하지 않았을 수 있습니다. –

+0

아마 파이썬에 보내는 텍스트의 끝에 개행이 필요하다면 ...? – noahlz

+0

나는 행운을 빌어 그것도 시도했다. –

0

Foo 프로그램에 이상한 것이 없습니다. 필자는 입력을 파이썬 대신 출력으로 되 돌리는 프로그램으로 테스트했으며 완벽하게 작동합니다.

관련 문제