2014-09-23 84 views
0

我想寫一個接受一個字符串,然後可以從系統(終端)輸出的東西的java方法系統(「ls」)。當我運行我當前的程序時,它工作並輸出src/bin。但是當我添加「ls -l」時,程序終止,並且我沒有輸出。我很無知,如何解決這個問題。這是我的代碼。編寫訪問系統的方法?

public class getSystemInfo 
{ 
    public static void main(String args []) 
    { 
     system("ls -l"); 
    } 

public static void main(String args []) 
{ 
    ArrayList<String> array = new ArrayList<String>(); 
    String s = "ls -l"; 
    StringTokenizer tok = new StringTokenizer(s,"-,:"); 
    while(tok.hasMoreTokens()) 
    { 
     array.add(tok.nextToken()); 
    } 


    try 
    { 
     Process p = new ProcessBuilder(array).redirectErrorStream(true).start(); 
     Scanner c = new Scanner(p.getInputStream()); 
     while(c.hasNext()) 
     { 
      println(c.nextLine()); 
     } 
     c.close(); 
    } catch (IOException e) {} 
+0

不是直接回答你的問題,但沒有這樣的事情,你可以通過單行腳本語言 – Cratylus 2014-09-23 21:09:14

+0

我知道,但其在學校的作業做學習如何使用java一個會做到這一點的方法。我知道其他編程語言有這樣的方法,但Java不 – user3242607 2014-09-23 21:11:47

+0

你需要處理流。研究這個http://alvinalexander.com/java/java-exec-processbuilder-process-1 – Cratylus 2014-09-23 21:13:21

回答

0

你可以regexsplit的命令(例如"-"),然後你的命令創建適當的PARAMS。例如

private static void system(String cmd) throws IOException { 
     List<String> params = new ArrayList<>(); 
     String[] chunks = cmd.split("-"); 
     params.add(chunks[0].trim()); 

     for (int i = 1; i < chunks.length; i++) { 
      params.add("-"+chunks[i].trim()); 
     } 

     ProcessBuilder pb = new ProcessBuilder (params); 
     Process p = pb.start(); 
     Scanner sc = new Scanner(p.getInputStream()); 
     while(sc.hasNext()) { 
      System.out.println((sc.nextLine())); 
     } 
    } 
+0

是否使用多個分隔符分割? – user3242607 2014-09-23 21:46:39

+0

更新回答,添加到java文檔的鏈接 – sol4me 2014-09-23 21:51:51

0

我認爲你是在正確的方向。嘗試令牌化的空間分隔的命令名稱和參數,就像這樣:

StringTokenizer tok = new StringTokenizer(s," ,:"); 
0

我發現了,所以我需要添加的sh -c我的陣列前面的ProcessBuilder不接受*字符。

public static void main(String args []) 
{ 
ArrayList<String> array = new ArrayList<String>(); 
String s = "ls -l"; 
StringTokenizer tok = new StringTokenizer(s,"-,:"); 
while(tok.hasMoreTokens()) 
{ 
    array.add("sh"); 
    array.add("-c"); 
    array.add(tok.nextToken()); 
}