2011-04-25 56 views
0

我想將「dir」命令的結果輸出到java控制檯。我已經看過谷歌和這裏,但沒有任何例子適合我,因此讓我成爲這個職位。將「dir」的結果輸出到Java控制檯中

我的代碼如下:

try 
    { 
     System.out.println("Thread started.."); 
     String line = ""; 
     String cmd = "dir"; 

     Process child = Runtime.getRuntime().exec(cmd); 

     //Read output 
     BufferedReader dis = new BufferedReader(new InputStreamReader(child.getInputStream())); 

     while ((line = dis.readLine()) != null) 
     { 
      System.out.println("Line: " + line); 
     } 

     dis.close(); 

    }catch (IOException e){ 

    } 

我在做什麼錯?

任何幫助將是非常好的。

由於提前,

達里爾

回答

3
  1. 您不能運行「目錄」是一個過程,你需要將其更改爲String cmd = "cmd dir";
  2. 根本不處理異常。在catch塊中添加行e.printStackTrace());會告訴你我寫在(1)中的內容。 永遠不要忽視異常!
  3. 您不處理錯誤流。這可能會導致程序掛起,處理錯誤流並使用不同的流並行讀取兩個流(錯誤和輸入)。
+0

非常感謝。這基本上解決了我的問題。經驗教訓..關於(3),我該如何處理錯誤流?用try/catch還是? – Dar56 2011-04-25 22:26:33

+0

另請參閱[ls -R]的此Java實現(http://stackoverflow.com/questions/2007071/nix-ls-command-in-java/2009376#2009376) – trashgod 2011-04-25 22:29:36

+0

@ Dar56 - 您可以獲得差錯流以相同的方式獲得輸入流 - child.getErrorStream()。 – MByD 2011-04-25 22:37:50

0
  • a)什麼是java控制檯?
  • b)你應該使用javas File.listFiles()而不是Runtime.exec,這是不可移植的,並且使名稱拆分成爲必需 - 對於包含空格,空格,換行符等的文件名來說,這是一件很難的事情。
  • c)你的代碼有什麼問題?
  • d)爲什麼你在異常情況下不做任何事情?
0

這裏是佔OS版本和錯誤條件(如MByD如上所述)進行更徹底的例子

http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4

請記住,使用「執行」是指你的應用不再交併且失去了Java的主要優勢之一。

更好的方法是使用java.io包。

http://download.oracle.com/javase/tutorial/essential/io/dirs.html

+0

這是否意味着如果我的cmd =「ping www.google.com」,它不會跨平臺?還是僅僅因爲「dir」命令? – Dar56 2011-04-25 22:49:01

+0

是的。我特別回答了您在示例中使用了「dir」這一事實。一般來說,「exec」正在機器上運行一個進程。這意味着您傳遞它的命令依賴於機器。 – Kal 2011-04-26 01:13:24

+0

好的非常感謝。我只有一個問題。我已成功使用此代碼來獲取ping和dir結果,但是當我嘗試從arpspoof獲取屏幕輸出時,它不會給我任何迴應。是否有一個原因? – Dar56 2011-04-26 12:36:49

1

最好的辦法是使用公共EXEC http://commons.apache.org/exec/

這樣做的東西,趕上怪癖,真正能推動你了牆,如整個過程阻斷,如果你不清除其輸出流,轉義命令中的引號等。

這裏是一個方法,將成功地在窗口中運行del命令。注意使用CMD,因爲德爾是不是一個獨立的可執行文件:

private void deleteWithCmd(File toDelete) throws IOException { 
    CommandLine cmdLine = new CommandLine("cmd.exe"); 
    cmdLine.addArgument("/C"); 
    cmdLine.addArgument("del"); 
    cmdLine.addArgument(toDelete.getAbsolutePath()); 
    DefaultExecutor executor = new DefaultExecutor(); 
    int exitValue = executor.execute(cmdLine); 
} 
0

您也可以在Java 6中類似的東西:

import java.io.File; 
import java.io.FilenameFilter; 
import java.io.IOException; 

public class ListFilesFromRegExp { 

    public static void main(String[] args) throws IOException { 
     File dir = new File("files/"); 
     File[] files = dir.listFiles(new FilenameFilter() { 
      public boolean accept(File dir, String name) { 
       return name.matches("File[0-9].c"); 
      } 
     }); 
     for (int i = 0; i < files.length; i++) { 
      System.out.println(files[i].getAbsolutePath()); 
     } 
    } 
}