2012-03-21 103 views
1

我試圖在java程序中運行「剪切」,但是我失去了如何分割命令數組的問題。 我在命令行程序如下:在Java中執行外部程序

cut file.txt -d' ' -f1-2 > hits.txt 

而且我想這樣

Runtime rt = Runtime.getRuntime(); 
Process pr = rt.exec(new String[]{"file.txt"," -d' ' -f1-2 "," > hits.txt"}); 
pr.waitFor(); 

運行Java裏面,但我得到以下運行時錯誤

Exception in thread "main" java.io.IOException: Cannot run program "cut file.txt": java.io.IOException: error=2, No such file or directory 

我把這個錯誤歸因於我用作exec命令的字符串數組。任何想法如何做到這一點?還有關於該問題的任何已知文檔。謝謝

+0

'pr2'和'rt2'?請修正你的變量名稱。 – 2012-03-21 22:36:13

+0

它看起來好像運行java進程的用戶沒有文件'file.txt'的權限,或者更有可能的是,file.txt與您運行java進程的位置不在同一個目錄中。您可以更正相對路徑或切換到絕對路徑。 – Brad 2012-03-21 22:36:20

+2

這是確切的代碼?不應該切入命令數組中嗎? – 2012-03-21 22:38:57

回答

1

請要麼對於bash腳本的:

"/bin/bash" "-c" "cut file.txt -d' ' -f1-2 > hits.txt" 

或分割

"cut" "file.txt" "-d" "' '" "-f" "1-2" 

錯誤消息明確表示:

Cannot run program "cut file.txt" 

所以它解釋 「切file.txt的」 如一個空白的程序名。

您的問題重定向開始,因爲你不能重定向輸出這種方式:

"cut" "file.txt" "-d" "' '" "-f" "1-2" ">" "hits.txt" 

你必須處理輸入和輸出流。在Java中實現cut,獲得可移植的解決方案或調用用戶可能在命令行或配置文件中指定的腳本可能會更好,因此它可以適用於Windows或其他平臺。

調用/斌/ bash和重定向那裏應該工作 - 在unix像系統。

+0

「-c」是做什麼的? – 2012-03-22 15:39:03

+1

@JulioDiaz:'-c'的意思是,這裏有一個命令。見'bash --help'。該命令是第三個字符串,它由bash作爲整個腳本進行解析。 – 2012-03-22 20:09:19

1

如果你想要輸出重定向,你必須自己做。 > hits.txt不會做你想做的。從exec調用的過程重定向標準輸出包含in another StackOverflow question

您顯示的錯誤與您在此處列出的源代碼不一致 - 首先,cut沒有源代碼。這絕對是試圖理解cut file.txt是一個單一可執行文件的完整相對路徑,它的名字中有一個空格,這幾乎肯定不是你想要的。使用正確的代碼對此進行故障排除會更容易。