从.text文件读取数据并将其存储在JTable中

时间:2012-12-02 07:41:18

标签: java linux swing file-io jtable

我想将命令“ps -e> /home/workspace/MyProject/List.txt”的输出重定向到JTable。这有什么办法吗?如果是,怎么样?

PS:我希望在用户退出之前连续执行此命令,并且每次执行此命令时JTable都会更新。

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

我使用watchservice API来监控MyProject目录中的更改。

所以经过这么多的编辑,我开始意识到命令没有用run.exec()执行当我从终端执行它时,它运行良好但是当我在Java程序中运行它时,没有文件是创建。谁能告诉我我做错了什么?我正在使用Ubuntu 12.04。

1 个答案:

答案 0 :(得分: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();
 }
}