至於基於令牌的錯誤,你應該用一串字符串調用這些命令;每個元素表示命令行的標記。所以試試吧,例如:
Runtime.getRuntime().exec(new String[] { "ls", "-lrt", "service/logs/post/level2.log" });
爲了調用ls命令。在這種情況下,我認爲這不是必需的嚴格的,但它將用於awk
命令,因爲Java不知道關於特定於shell的引用規則的任何內容,所以默認情況下在該空間上標記單個字符串輸入字符。這就是爲什麼你的awk腳本被分成兩部分的原因。
編輯(響應評論):在第一個選項,我的意思僅僅是你能管這兩個過程自己,在Java之間的輸出。
試想一下,如果你已經創建了一個過程,所以:
Process ls = Runtime.getRuntime().exec("ls -lrt service/logs/post/level2.log");
現在,這個過程將運行併產生一些輸出(我們知道這將是描述該文件中的行)。我們可以得到流爲這個輸出像這樣:
InputStream lsOut = ls.getInputStream();
現在,我們希望運行AWK過程:
Process awk = Runtime.getRuntime().exec(new String[] { "awk", "{print $9}"});
當然awk的過程中會坐在那裏等着輸入的那一刻,因爲它知道它將從stdin讀取。所以,我們搶輸入流,它的將要使用:現在
OutputStream awkIn = awk.getOutputStream();
,管道位 - 我們看到ls命令的輸出,並將其傳遞到awk的輸入:
// TODO add buffering, error handling, probably run this in a separate thread
int datum = lsOut.read();
while (datum != -1)
{
awkIn.write(datum);
datum = lsOut.read();
}
這將讀取ls
的輸出(爲了簡單起見,使用字節數組緩衝區會更快,但我試圖簡單地說明這個概念),並將其寫入awk
的輸入。
然後它只是讀取awk
過程的輸出並按照您認爲合適的方式處理它。
對不起,親愛的,我無法忍受一點善意的幫助。 – user369151 2010-06-22 12:39:54
我需要了解第一個過程輸出到第二個過程輸入流的部分。 – user369151 2010-06-22 12:41:29
@Andrzej Doyle:只是想檢查一下:執行Runtime.getRuntime().exec(「file.sh」)是否可以工作或甚至沒有? – Xorty 2010-06-22 12:41:43