1. 程式人生 > >java實現shell命令--小程式(通過Runtime和Process實現)

java實現shell命令--小程式(通過Runtime和Process實現)

先上程式碼(功能是要列出目錄):

package testProcess;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.LineNumberReader;

public class testProcessBuilder {  
       
        public static Object exec(String cmd) {  
            try {  
                String[] cmdA = { "/bin/sh", "-c", cmd };  
                Process process = Runtime.getRuntime().exec(cmdA);


                
                BufferedReader br = new BufferedReader(new InputStreamReader(  
                        process.getInputStream()));  
          /*      LineNumberReader br = new LineNumberReader(new InputStreamReader(  
                        process.getInputStream()));*/  
                StringBuffer sb = new StringBuffer();  
                String line;  
                int i=0;
             while ((line = br.readLine()) != null) {  
                    sb.append("["+(i++)+"]"+line).append("\n");  
                }  
                return sb.toString();  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
            return null;  
        }  
       
        public static void main(String[] args) {  
            // TODO Auto-generated method stub  
            String netsString = exec("cd ~/testDirectory \r\n ls").toString();   
            System.out.println("==========列出目錄=============");  
            System.out.println(netsString);  
        }  
       
    } 

輸出:

==========列出目錄=============
[0]360度攝像
[1]A107開發包
[2]adt-bundle-linux-x86_64-20140321
[3]adt-bundle-linux-x86_64-20140321.zip
[4]browserDown
[5]deveEn
[6]project
[7]smart

當不寫"/bin/sh", "-c"時,控制檯報如下錯誤:

java.io.IOException: Cannot run program "cd ~/testDirectory
 ls": error=2, 沒有那個檔案或目錄
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1047)
    at java.lang.Runtime.exec(Runtime.java:617)
    at java.lang.Runtime.exec(Runtime.java:485)
    at testProcess.testProcessBuilder.exec(testProcessBuilder.java:12)
    at testProcess.testProcessBuilder.main(testProcessBuilder.java:34)
Caused by: java.io.IOException: error=2, 沒有那個檔案或目錄
    at java.lang.UNIXProcess.forkAndExec(Native Method)
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:186)
    at java.lang.ProcessImpl.start(ProcessImpl.java:130)
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1028)
    ... 4 more
Exception in thread "main" java.lang.NullPointerException
    at testProcess.testProcessBuilder.main(testProcessBuilder.java:34)

原因如下:

#!/bin/bash 以bash shell來解釋(linux平臺用到shell命令時)

其他:

#!/bin/csh 以csh shell來解釋
#!/usr/bin/env python 以下程式碼由python來解釋

簡單介紹下Runtime和Process:

 Runtime類封裝了執行時的環境。
每個 Java 應用程式都有一個 Runtime 類例項,使應用程式能夠與其執行的環境相連線。
一般不能例項化一個Runtime物件,應用程式也不能建立自己的 Runtime例項,
但可以通過 getRuntime 方法獲取當前Runtime執行時物件的引用。
一旦得到了一個當前的Runtime物件的引用,就可以呼叫Runtime物件的方法
去控制Java虛擬機器的狀態和行為。

java.lang.Runtime.getRuntime() 方法返回與當前的Java應用程式的執行時物件。
此方法返回與當前的Java應用相關的執行時物件。
Runtime類的方法是例項方法,就必須呼叫當前執行時物件.Runtime.exec()方法可以建立一個本地程序,
並返回Process子類的一個例項。

Process類是一個抽象類,其內部所有的方法都是抽象的。主要作用是建立一個可以管理的程序,並對它進行管理。
該類提供程序的輸入、執行輸出到程序、等待程序的完成和檢查程序的退出狀態及銷燬程序的方法。