Java技巧:使用Runtime.exec重新導向本地程式Java技巧:使用Runtime.exec重新導向本地程式調用調用

來源:互聯網
上載者:User
http://www.csip.com.cn/26/n-18126.html

Java技巧:使用Runtime.exec重新導向本地程式調用

Java具有使用Runtime.exec對本地程式調用進行重新導向的能力,但是用重新導向或者管道進行命令調用將會出錯。解決這一問題的辦法是通過命令shell運行命令。在Java中調用本地程式會破壞平台獨立性規則,但是經常需要這麼做才行。

以下是一個簡單類的範例,展示了在Unix下運行ls命令的情形:

import java.io.BufferedInputStream;

import java.io.IOException;

public class ExecLs {

static public void main(String[] args) {

String cmd = "ls"

try {

Process ps = Runtime.getRuntime().exec(cmds);

System.out.print(loadStream(ps.getInputStream()));

System.err.print(loadStream(ps.getErrorStream()));

} catch(IOException ioe) {

ioe.printStackTrace();

}

}

// read an input-stream into a String

static String loadStream(InputStream in) throws IOException {

int ptr = 0;

in = new BufferedInputStream(in);

StringBuffer buffer = new StringBuffer();

while( (ptr = in.read()) != -1 ) {

buffer.append((char)ptr);

}

return buffer.toString();

}

}

上述代碼中重要的部分是exec方法和命令字串ls。本程式將輸出運行目錄下的列表細節。

那麼,如果你想重新導向這些細節內容到檔案該怎麼辦?這一命令列的輸入應該寫成ls > FILE,但是當你將cmd變數改變成這樣的話,運行就會出錯,如下:

/bin/ls: >: No such file or directory

/bin/ls: FILE: No such file or directory

出錯的原因在於額外的參數被直接傳送到了ls命令而不是送到實際的命令列。解決這一問題的辦法是將cmd串弄成一個字串數組,並且將你想啟動並執行程式傳送到命令shell。

因此,將cmd行改成下面的樣子:

String[] cmd = { "sh", "-c", "ls > FILE" };

你將得到一個名為FILE的檔案,裡面是目錄列表。-c參數是告訴它讀取隨後的字串,而最後的參數是你要啟動並執行指令碼。

在這種情況下,管道也運行良好,所以你可以把命令改成下面的方式:

String[] cmd = { "/bin/sh", "-c", "/bin/ls | grep d > FILE" };

這種形式將給你一個名為FILE的檔案,裡面是ls條目中包含d的條目。給出sh和ls的全路徑有利於提供你的程式的安全性。

雖然使用Runtime.exec不是建立獨立於平台的Java的最佳方式,但是有些時候是必要的。使用這種重新導向技術有助於走出Runtime.exec的限制。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.