2011-04-27 43 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