2011-04-27 35 views
0

使用java在Linux中启动GNOME终端进程并将其输入和输出重定向到我的代码。以下是一个代码。Java进程IO

 public static void main(String[] args) throws InterruptedException 
    { 
     // TODO Auto-generated method stub /usr/bin/telnet 
     try 
     { 
      String line, commandInput; 
      Scanner scan = new Scanner(new File("/home/Ashutosh/Documents/testfile")); 
      ProcessBuilder telnetProcessBuilder = new ProcessBuilder("/bin/bash");///home/Ashutosh/Documents/tempScript"); 
      telnetProcessBuilder.redirectErrorStream(true); 
      Process telnetProcess = telnetProcessBuilder.start(); 
      //Process telnetProcess = Runtime.getRuntime().exec("xterm");///home/Ashutosh/Documents/tempScript"); 
      BufferedReader input = new BufferedReader(new InputStreamReader(telnetProcess.getInputStream())); 
      BufferedWriter output = new BufferedWriter(new OutputStreamWriter(telnetProcess.getOutputStream())); 
      while(scan.hasNext()) 
      { 
       commandInput = scan.nextLine(); 
       output.write(commandInput); 
/*    if(commandInput.trim().equals("exit")) 
       { 
        output.write("exit\r"); 
       } 
       else 
       { 
        output.write("((" + commandInput + ") && echo --EOF--) || echo --EOF--\r"); 
       } 
*/    output.flush(); 
       line = input.readLine(); 
       while(line != null && !line.trim().equals("--EOF--")) 
       { 
        System.out.println(line); 
        line = input.readLine(); 
       } 
       if(line == null) 
        break; 
      } 
/*   Thread.sleep(500); 
      output.write("/home/Ashutosh/Documents/testfile\r"); 
      Thread.sleep(500); 
      output.flush(); 

      while((line = input.readLine())!= null) 
       System.out.println(line); 
      telnetProcess.destroy(); 
*/   //String s = input.readLine(); 
      //System.out.print(s + "\r\n"); 
      //s = input.readLine(); 
      //System.out.print(s + "\r\n"); 
     } 

testfile的内容是bash脚本是

#!/bin/bash 

ls -l 
pwd 
date 
exit 

,我也尝试了以下交互式脚本这需要输入从用户我想从Java代码重定向给出

#! /bin/bash 
echo "Input any number form 0-3:" 
read num 
case $num in 
    0) echo "You are useless";; 
    1) echo "You are number 1";; 
    2) echo "Too suspecious";; 
    3) echo "Thats all man, got to go...!";; 
    *) echo "Cant't u read english, this is wrong choice";; 
esac 
read 
exit 

我的代码停在input.readLine();即时通讯不知道,但我认为我无法重定向输出流

output.write(commandInput); 

命令运行良好,但没有写入我打算在进程重定向输入,这就是为什么它挂起在readLine();。 如果有人已经解决了请让我知道解决方案。 从下面的链接,我试图解决这个问题,但仍然没有运气:

Java Process with Input/Output Stream

感谢

Ashutosh说

回答

1

嗨,大家抱歉,迟到的反应,经过一些审判后,我得到它的工作。我只是让进程完成它的过程和正常退出,而不是强制,然后的BufferedReader和BufferedWriter将保持在RAM中的字符串缓冲区,我可以现在进程退出后,用代码彼得,即使在0

public static void main(String[] args) throws InterruptedException 
{ 
    // TODO Auto-generated method stub 
    try 
    { 
     String line, commandInput; 
     ProcessBuilder telnetProcessBuilder = new ProcessBuilder("/bin/bash"); 
     telnetProcessBuilder.redirectErrorStream(true); 
     Process telnetProcess = telnetProcessBuilder.start(); 
     BufferedReader input = new BufferedReader(new InputStreamReader(telnetProcess.getInputStream())); 
     BufferedWriter output = new BufferedWriter(new OutputStreamWriter(telnetProcess.getOutputStream())); 
     commandInput = "ls -l\n"; 
     output.write(commandInput); 
     output.flush(); 
     commandInput = "pwd\n"; 
     output.write(commandInput); 
     output.flush(); 
     commandInput = "whoami\n"; 
     output.write(commandInput); 
     output.flush(); 
     commandInput = "exit\n"; 
     output.write(commandInput); 
     output.flush(); 
     while((line = input.readLine())!= null) 
      System.out.println(line); 
    } 
} 
2

的readLine()读取一行内容,不换行末。 ()只写入文本,它不会添加新行。

也许你想添加写(“\ n”);或使用PrintStream或PrintWriter。

我想,你的脚本来发送的

#!/bin/bashls -lpwddateexit 

这是一个没有换行的注释。

+0

喜读在字符串中读取命令后添加“\ n”或“\ r”,没有任何变化,我不知道可能是什么问题? – Ashutosh 2011-04-27 12:01:19

1

编辑:巨大的错误,没有添加到ProcessBuilder的命令!

为什么不只是将脚本作为Linux脚本运行?也就是说,

ProcessBuilder builder = new ProcessBuilder(); 
LinkedList<String> command = new LinkedList<String>(); 
command.add("/bin/bash"); 
command.add("/home/Ashutosh/Documents/testfile"); 
builder.command(command); 

Process myProc = builder.start(); 

而且,我注意到变量被命名为“telnetProcess”尚没有远程登录的调用的任何地方,我可以看到。也许这是问题?

编辑:添加我的建议下面的交互式脚本。

ProcessBuilder builder = new ProcessBuilder(); 
LinkedList<String> command = new LinkedList<String>(); 
command.add("/bin/bash"); 
command.add("/path/to/interactiveScript"); 
builder.command(command); 

final Process myProc = builder.start(); 

// Java input goes to process input. 
Thread inputParser = new Thread() { 
    public void run() { 
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(myProc.getOutputStream())); 
    String line = ""; 
    while(line != null) { 
     line = br.readLine(); 
     bw.write(line); 
     bw.newLine(); 
    } 
    } 
}.start(); 

// Process output must go to Java output so user can see it! 
Thread outputParser = new Thread() { 
    public void run() { 
    BufferedReader br = new BufferedReader(new InputStreamReader(myProc.getInputStream())); 
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); 
    String line = ""; 
    while(line != null) { 
     line = br.readLine(); 
     bw.write(line); 
     bw.newLine(); 
    } 
    } 
}.start(); 
+0

我知道它的愚蠢的名称为对象,但这与telnet无关,它只是一个简单的测试应用程序,我想测试java进程IO。在我的一个应用程序中,我需要用户调用这个java应用程序,它可以执行所有的脚本运行,并在没有用户干预的情况下获取所有输出。 – Ashutosh 2011-04-27 11:37:10

+0

在上面的代码中,您正在从Java应用程序运行/ bin/bash,并在输出流中发送内容,希望bash从stdin中读取并处理它。我认为首先你应该尝试一下我之前建议的简单选项,在这里使用命令“/ bin/bash/home/Ashutosh/Document/testfile”来运行脚本并打印输出。一旦完成,你可以使用bash的stdin处理。 – Bringer128 2011-04-28 02:56:21

+0

您的第二个交互式脚本也需要以不同的方式处理。交互式脚本有两个有效的执行线程。首先是来自用户的Java输入到其子进程的输入。为此,您需要从System.in()获取输入并将其推送到Process.getOuputStream()。相反,当子进程打印某些Java程序需要从Process.getInputStream()中读取并输出到System.out()的内容时。 – Bringer128 2011-04-28 02:59:51