2012-12-02 254 views
0

我想將命令「ps -e> /home/workspace/MyProject/List.txt」的輸出重定向到JTable。有沒有辦法做到這一點?如果是,如何?從.txt文件讀取數據並將其存儲在JTable中

PS:我希望這個命令可以連續執行,直到用戶退出並且JTable每次執行該命令時都會更新。

runtime.exec("ps -e > /home/workspace/MyProject/List.txt"); 

我已經使用watchservice API來監視MyProject目錄中的更改。

所以經過如此多的編輯之後,我開始意識到命令沒有用run.exec()執行。當我從終端執行它時,它運行良好,但是當我在Java程序中運行它時,被建造。任何人都可以告訴我我做錯了什麼?我使用的是Ubuntu 12.04。

+1

*「有什麼辦法嗎?」*是的,有。我應該把它作爲答案嗎? [你有什麼嘗試?](http://www.whathaveyoutried.com/) –

+0

@AndrewThompson是的請。我會標記它,如果它適用於我:( –

+0

爲什麼你應該把它寫在一個文件中,而不是你可以直接在表中 – vels4j

回答

1

用windows Tasklist命令測試,你用linux命令試試。

public class ProcessListTable { 

    private String GetProcessListData() { 
    Process p; 
    Runtime runTime; 
    String process = null; 
    try { 
     System.out.println("Processes Reading is started..."); 

     //Get Runtime environment of System 
     runTime = Runtime.getRuntime(); 

     //Execute command thru Runtime 
     // use appropriate command for linux "ps" 
     p = runTime.exec("tasklist /FO CSV /nh"); 

     //Create Inputstream for Read Processes 
     InputStream inputStream = p.getInputStream(); 
     InputStreamReader inputStreamReader = new InputStreamReader(inputStream); 
     BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 


     ArrayList<String> taskEntries = new ArrayList(); 
     String line = bufferedReader.readLine(); 
     while (line != null) { 
      taskEntries.add(line); 
      line = bufferedReader.readLine(); 
     } 
     bufferedReader.close(); 
     inputStreamReader.close(); 
     inputStream.close(); 

     MyTableModel myTableModel = new MyTableModel(); 
     myTableModel.update(taskEntries); 
     JTable table = new JTable(myTableModel); 
     JFrame frame = new JFrame("TaskList"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.add(new JScrollPane(table)); 
     frame.pack(); 
     frame.setVisible(true); 


     System.out.println("Processes are read."); 
    } catch (IOException e) { 
     System.out.println("Exception arise during the read Processes"); 
     e.printStackTrace(); 
    } 
    return process; 
} 

public class MyTableModel extends AbstractTableModel { 

    String[] columnName = new String[]{"Image Name", "PID", "Session Name", "Session#", "Mem Usage"}; 
    String[][] valueA; 

    public void update(ArrayList<String> taskEntries) { 
     valueA = new String[taskEntries.size()][columnName.length]; 
     int size = taskEntries.size(); 
     for (int i = 0; i < size; i++) { 
      String entry = taskEntries.get(i); 
      String[] splitValues = entry.split(","); 
      for (int j = 0; j < splitValues.length; j++) { 
       String v = splitValues[j]; 
       v = v.replaceAll("\"", ""); 
       // mem contains "," so added mem usage at the end 
       if (j >= 5) { 
        valueA[i][4] = valueA[i][4] + v; 
       } else { 
        valueA[i][j] = v; 
       } 
      } 
     } 
    } 

    @Override 
    public int getRowCount() { 
     return valueA.length; 
    } 

    @Override 
    public String getColumnName(int column) { 
     return columnName[column]; 
    } 

    @Override 
    public int getColumnCount() { 
     return columnName.length; 
    } 

    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) { 
     return valueA[rowIndex][columnIndex]; 
    } 
} 

public static void main(String[] args) { 
    ProcessListTable gpl = new ProcessListTable(); 
    gpl.GetProcessListData(); 
} 
} 
+0

可能要看的東西。1)'ProcessBuilder'(讓它更容易erge'out'和'err'流)2)同時使用兩個流。 3)將命令分解爲一個String [](不是用這個命令似乎是必要的,但是當使用帶空格的路徑時會混淆) - +1作爲你的詳細答案。 :) –

+1

@AndrewThompson謝謝。我只是大致反對這個評論*「這個問題顯然過於寬泛,爲什麼不投票結束它,而不是給出一個正確的,但無益的答案?」* – vels4j

+0

好的電話。現在刪除。 ;) –

相關問題