다음 코드를 사용하여 다른 곳에서 사용할 수 있도록 노력하고 있습니다.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();
}
}
}
}
코드를 검사하여 오류를 확인해 보셨습니까? 'PrintWriter'는 그것들을 숨 깁니다. 아마도 더 강력한 오류 처리 기능이있는 다른 IO 클래스를 사용하는 것을 고려해보십시오 (이유를 설명해주십시오.). – noahlz
@noahz 무슨 뜻인지 모르겠습니다. 플러시 전후에 pWriter에 "checkError"호출을하면 false를 반환합니다. 예외를 던지기보다는 주에서 예외를 잡으면 아무 것도 잡지 못합니다. 나는 또한 "println"보다는 "write"를 사용하여 BufferedWrither를 시도 했으므로 다른 I/O 클래스를 사용하는 것에 반대하지는 않습니다. –
인쇄가 괜찮아 보입니다. 아마도 마지막 토큰을 유지하고 앞을 읽는 스캐너 일 것입니다. 그냥 InputStream을 사용하여 행을 읽으십시오. 프로세스 사용에 관한 모든 것을 올바르게 얻는 것은 어렵습니다. –