作爲一個Java開發人員,有些常用的Linux命令必須掌握。即時平時開發過程中不使用Linux(Unix)或者mac系統,也需要熟練掌握Linux命令。因爲很多服務器上都是Linux系統。所以,要和服務器機器交互,就要通過shell命令。本文爲大家分享的就是java程序中怎麼調用linux命令。
Java調用shell
Java語言以其跨平臺性和簡易性而著稱,在Java裏面的lang包裏(ime)提供了一個允許Java程序與該程序所運行的環境交互的接口,這就是Runtime類,在Runtime類裏提供了獲取當前運行環境的接口。
其中的exec函數返回一個執行shell命令的子進程。exec函數的.具體實現形式有以下幾種:
public Process exec(String command) throws IOException
public Process exec(String command,String[] envp) throws
IOException
public Process exec(String command,String[] envp,File dir) throws
IOException
public Process exec(String[] cmdarray) throws IOException
public Process exec(String[] cmdarray, String[] envp) throws
IOException
public Process exec(String[] cmdarray, String[] envp,File dir)
throws IOException
我們在這裏主要用到的是第一個和第四個函數,具體方法很簡單,就是在exec函數中傳遞一個代表命令的字符串。exec函數返回的是一個Process類型的類的實例。Process類主要用來控制進程,獲取進程信息等作用。(具體信息及其用法請參看Java doc)。
1)執行簡單的命令的方法:
代碼如下:
try
String commands = "ls -l";
Process process = untime() (commands);
// for showing the info on screen
InputStreamReader ir=new
InputStreamReader(nputStream());
BufferedReader input = new BufferedReader (ir);
String line;
while ((line = Line ()) != null){
tln(line);
}//end try
catch (ception e){
tln ("IOException " + essage());
} 上面的代碼首先是聲明瞭一個代表命令的字符串commands,它代表了ls -l
這個命令。之後我們用untime()(commands)來生成一個子進程來執行這個命令,如果這句話運行成功,則命令 ls -l 運行成功(由於沒有讓它顯示,不會顯示ls -l
的結果)。後面的流操作則是獲取進程的流信息,並把它們一行行輸出到屏幕。2)執行帶有參數的命令(尤其是參數需要用引號的)時則需要用String的數組來表示整個命令,而且要用轉義符把引號的特殊含義去除,例如我們要執行find / -name "*mysql*" -print 時,用如下代碼
try
String[] commands = new
String[]{"find",".","-name","*mysql*","-print"};
Process process = untime() (commands);
InputStreamReader ir=new
InputStreamReader(nputStream());
BufferedReader input = new BufferedReader (ir);
String line;
while ((line = Line ()) != null){
tln(line);
}//end try
catch (ception e){
tln ("IOException " + essage());
Java 可以通過 Runtime 調用Linux命令,形式如下:
untime()(command)
但是這樣執行時沒有任何輸出,因爲調用 方法將產生一個本地的進程,並返回一個Process子類的實例(注意:untime()(command)返回的是一個Process類的實例)該實例可用於控制進程或取得進程的相關信息。
由於調用 方法所創建的子進程沒有自己的終端或控制檯,因此該子進程的標準IO(如stdin,stdou,stderr)都通過 utputStream(),nputStream(), rrorStream() 方法重定向給它的父進程了。
用戶需要用這些stream來向子進程輸入數據或獲取子進程的輸出,下面的代碼可以取到 linux 命令的執行結果:
try {
String[] cmd = new String[]{”/bin/sh”, “-c”, ” ls “};
Process ps = untime()(cmd);
BufferedReader br = new BufferedReader(new InputStreamReader(nputStream()));
StringBuffer sb = new StringBuffer();
String line;
while ((line = Line()) != null) {
nd(line)nd(”n”);
}
String result = ring();
tln(result);
} catch (Exception e) {
tStackTrace();
}