2015-02-10 78 views
0

我想从一个Java应用程序运行一个.exe文件,并希望能够使用它(现在)像一个终端,在那里我可以写入.exe然后回读它,然后再次写入。如果BufferedWriter仍然打开,为什么BufferedReader会失败?

我的问题是只有在读取器试图从输入流读取之前关闭写入器时,该代码才起作用。

String line = "", prev = ""; 
    Scanner scan = new Scanner(System.in); 

    ProcessBuilder b = new ProcessBuilder("myexe"); 
    b.redirectErrorStream(true); 

    Process p = b.start(); 
    OutputStream stdin = p.getOutputStream(); 
    InputStream stdout = p.getInputStream(); 

    BufferedReader reader = new BufferedReader(new InputStreamReader(stdout)); 


    System.out.println ("->"); 
    while (scan.hasNext()) { 
     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin)); 
     String input = scan.nextLine(); 
     if (input.trim().equals("exit")) { 
      writer.write("C"); 
     } else { 
      writer.write(input); 
     } 
     writer.flush(); 

     //writer.close(); 
     while ((line = reader.readLine()) != null) { 
      System.out.println ("[Stdout] " + line); 

      if (line.equals(prev)){ 
       break; 
      } 
      prev = line; 
      } 
      reader.close(); 
     } 

所以我的问题是,我在做ProcessBuilder的错误吗?我已阅读有关不正确读取输出可能导致系统挂起。但是这并不能解释为什么当作家仍然开放时它会挂起?

+0

子进程可能正在等待行尾字符。 – 2015-02-10 23:09:22

+0

我的确想到了这一点,并添加并测试了“\ n”“%n”“\ r \ n”到发送到写入缓冲区的字符串,仍然是同样的事情......是否有另一种方法呢? – 2015-02-11 09:22:08

回答

1

这个问题实际上与我的C编译.exe。在运行时,应用程序正在打印输出,因此在cmd终端中工作,但是在发送每个命令后我没有刷新缓冲区。一旦我完成了这个任务,Java应用程序就会在发送它们时识别每个命令。

相关问题