2012-12-02 3 views
0

"ps -e> /home/workspace/MyProject/List.txt"명령의 출력을 JTable으로 리디렉션하고 싶습니다. 그것을하는 어떤 방법이 있습니까? 그렇다면 어떻게?.txt 파일의 데이터를 읽고 JTable에 저장하십시오.

추신 :이 명령을 사용자가 종료 할 때까지 계속 실행하고 JTable을이 명령을 실행할 때마다 업데이트하려고합니다.

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

내가 MyProject를 디렉토리의 변화를 모니터링 할 수 watchservice API를 사용했다.

이렇게 많은 편집을 한 후에, 나는 run.exec() 명령으로 실행되지 않는다는 것을 깨닫게되었다. 터미널에서 실행하면 잘 돌아 간다.하지만 Java 프로그램 내에서 실행할 때 파일이 없다. 만들어집니다. 누구든지 내가 뭘 잘못하고 있는지 말해 줄 수 있니? 나는 우분투 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' (m 'out'과'err' 스트림을 모두 출력하십시오.) 2) 두 스트림을 모두 소비하십시오. 3) 명령을'String []'으로 분리하십시오 (이 명령으로는 필요하지 않지만 공백이있는 경로를 사용할 때 혼란 스러울 수 있습니다). :) –

+1

@AndrewThompson 감사합니다. 나는 단지이 논평에 대해 대략적으로 다루었 다. "질문은 지나치게 광범위하다. 왜 정확하지만 도움이되지 않는 대답을주는 대신 투표를 닫지 않을까? * – vels4j

+0

전화는 훌륭하다. 삭제되었습니다. ;) –

관련 문제