2012-03-26 115 views
2

我试图打开一个终端控制台,并能够读/写命令。从Java进程读取InputStream

我读到这样一些问题: Java Process with Input/Output Stream

与已能够构建打开的终端,并通过命令控制台,并打印出结果后面一个小应用程序,它可以与任何系统COMAND像浏览文件夹运行良好,删除文件和类似的东西。

我遇到的问题是我需要从该控制台加载另一个Java程序并读取其输出,但该程序使用java.util.logging.Logger发送其大部分输出,由于某种原因,我的启动应用程序可以'阅读记录器打印的内容。

基本上我试图建立像另一个Java应用程序的包装,因为我想与它交互,但无法修改它。

感谢您的帮助。

编辑

下面是代码,但正如我所说的它工作的事情,在“正常”标准输出,而不是输出记录仪打印到控制台的基本上是从另一个问题采取的,也。

package launcher; 

import java.io.*; 
import java.util.Scanner; 

public class Launcher { 

    public static void main(String[] args) throws IOException { 

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

     Process process = Runtime.getRuntime().exec("/bin/bash"); 

     OutputStream stdin = process.getOutputStream(); 
     InputStream stderr = process.getErrorStream(); 
     InputStream stdout = process.getInputStream(); 

     BufferedReader reader = new BufferedReader(new InputStreamReader(stdout)); 
     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin)); 

     while (scan.hasNext()) { 
      String input = scan.nextLine(); 
      if (input.trim().equals("exit")) { 

       writer.write("exit\n"); 
      } else { 
       writer.write("((" + input + ") && echo --EOF--) || echo --EOF--\n"); 
      } 
      writer.flush(); 

      line = reader.readLine(); 
      while (line != null && !line.trim().equals("--EOF--")) { 
       System.out.println("Stdout: " + line); 
       line = reader.readLine(); 
      } 
      if (line == null) { 
       break; 
      } 
     } 

    } 
} 
+0

你还没有给我们太多的东西去我们这里,我们基本上猜测...如果记录器打印到STD OUT,那么这应该工作,但它可能会记录到文件,或打印到STD ERROR ,或者做这些事情的混合物。 – Jon 2012-03-26 09:00:07

回答

1

没有看到任何代码/配置,我猜想,无论是记录器配置为写入到stderr(System.err的),你就只能读取标准输出(System.out的),否则记录仪配置为写入文件。

+1

你是完全正确的,我应该在凌晨4点停止这样做。非常感谢。 – josephfley 2012-03-26 09:07:35

0

每DTY的回答,我觉得默认的java.util.logging使用标准错误,所以你应该stderr重定向到标准输出,这样的:

ProcessBuilder builder = new ProcessBuilder("ls", "-l"); // or whatever your command is 
builder.redirectErrorStream(true); 
Process proc = builder.start(); 

FWIW以我的经验,你会更好试图通过在你自己的程序中启动它的main方法来使用另一个Java程序,而不是试图与输入/输出流等搏斗,但这取决于其他程序的功能。

+0

是的问题是我只读标准输出,默认情况下,记录器将其INFO放置到标准错误。 – josephfley 2012-03-26 09:08:52