2011-02-15 41 views
1

我想列出所有文件,並使用Java運行時將列表寫入.txt文件。而我這樣做:通過Java直接或間接訪問系統命令時出現問題?

File workDir = new File("/home/name/ghost/"); 
String cmd = "ls -l > data.txt"; 
Process pr = Runtime.getRuntime().exec(cmd, null , workDir); 

它沒有工作,直到我用shell腳本更換cmd命令:

String cmd = "./shell.sh"; 

,這裏是什麼樣的shell腳本:

#!/bin/bash 
ls -l > data.txt 
exit 0 

我想問問爲什麼我不能直接通過Java訪問系統命令?

+1

爲什麼你使用系統命令來做這件事,當你可以使用java.io時,它不會是可移植的?當然,它比你使用的shell腳本更多的代碼,但是你已經接受了你開始編寫java代碼的那一刻。 – whaley 2011-02-15 03:10:08

+0

我不知道你說的java.io。你能更詳細地回答嗎? – Silentbang 2011-02-15 15:06:16

回答

1

Runtime.exec不會做你認爲它做的事情。在你的命令中,它調用帶有參數「-l」,「>」和「data.txt」的「ls」,這是出錯的地方。這是因爲如果你這樣寫的:

String[] cmd = new String[] {"ls", "-l", ">", "data.txt"}; 

如果你真的想調用shell和使用shell的重定向操作符,這是很容易的,調用與您的命令shell作爲參數傳遞給外殼:

String[] cmd = new String[] {"sh", "-c", "ls -l > data.txt"}; 

當然,你也可以用Java來做,就像其他答案一樣。

0

我還沒有去打擾回答這個問題,因爲它是構成的,作爲同樣的事情可以使用Java只有不依賴於外部流程來完成:

File dir = new File("/some/dir"); 
    FileWriter fw = new FileWriter(new File("/some/file")); 
    for (File f : dir.listFiles()) { 
     fw.write(f.getName() + "\n"); 
    } 
    fw.close(); 
+1

爲了運行更復雜的腳本,您應該考慮這是一個示例腳本的概念。 – corsiKa 2011-02-15 03:35:57

1

的問題是,運營商>是您的shell的一個功能,不是Java或ls命令。

Runtime.exec不會嘗試複製任何類似shell的行爲;它只是試圖執行你給它的命令。你的第二個例子工作,因爲它顯式使用Bash運行ls -l > data.txt命令和Bash知道如何處理>

如果可以的話,最好使用@whaley建議的方法;否則使用shell腳本可能是獲得shell語義的唯一方法。