2012-10-04 44 views
2

我试图让下面的代码工作,以便我可以在其他地方使用它。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(); 
     } 
    } 
} 
} 
+0

您是否尝试过检查代码以检查错误? 'PrintWriter'隐藏这些。也许考虑使用具有更强大错误处理的不同IO类(如果您不能评论为什么)。 – noahlz

+0

@noahz我不确定你的意思。如果我在flush之前和之后在pWriter上调用“checkError”,它将返回false。如果我主要捕获异常而不是抛出异常,那我什么都不会捕获。我也尝试过使用BufferedWrither(使用“write”而不是“println”),所以我不反对使用不同的I/O类。 –

+0

印刷看起来不错;它可能是Scanner,它维护最后一个令牌并向前读取。尝试使用InputStream来读取行。很难正确处理流程使用情况。 –

回答

0

考虑使用Apache Commons Executor而不是直接使用Runtime.exec() API。

+0

我试过了,它似乎没有什么区别。这就是说,当我使用这个代码时,我可能没有正确地给它输入。 –

+0

也许你需要在发送给python的文本末尾换行...? – noahlz

+0

我也试过,没有运气。 –

0

我看不出你的程序Foo有什么问题。我测试了一个程序,它将输入回送到输出(而不是python),并且它完美地工作。