我试图让下面的代码工作,以便我可以在其他地方使用它。PrintWriter刷新不工作?
实际上,它(应该是)启动另一个进程,在其中运行python,并为python提供一些命令。但是,实际上,除非我关闭流程,否则python命令永远不会发送。我认为flush()应该强制这种情况发生,但它似乎没有起作用。任何人都可以提供任何见解,为什么flush()可能不工作,我能做些什么来避免这种情况?谢谢。
请注意,如果我调用close(),则会发送该命令。但是,我希望能够在这个命令后发送更多命令,所以在这里使用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我不确定你的意思。如果我在flush之前和之后在pWriter上调用“checkError”,它将返回false。如果我主要捕获异常而不是抛出异常,那我什么都不会捕获。我也尝试过使用BufferedWrither(使用“write”而不是“println”),所以我不反对使用不同的I/O类。 –
印刷看起来不错;它可能是Scanner,它维护最后一个令牌并向前读取。尝试使用InputStream来读取行。很难正确处理流程使用情况。 –