0

我有一个包含以下数据的 .txt 文件(注意:文件中的数据会定期更新,所以我不知道确切的行数)。我的 Java 应用程序在 JTable 中显示这些数据。这是我的txt文件:

root         1     0  0 09:49 ?        00:00:00 init [5]  
root         2     0  0 09:49 ?        00:00:00 [kthreadd]
root         3     2  0 09:49 ?        00:00:00 [ksoftirqd/0]
root         4     2  0 09:49 ?        00:00:00 [kworker/0:0]
root         6     2  0 09:49 ?        00:00:00 [migration/0]
root         7     2  0 09:49 ?        00:00:00 [watchdog/0]

我为它编码的是:

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
public class Reader {

    public Reader(){
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        BufferedReader reader;
        try {
            reader = new BufferedReader(new InputStreamReader(new FileInputStream("ProcessList.txt")));
            Map<String, Object[]> result = new LinkedHashMap<String, Object[]>();
            while(reader.ready()){
                String line = reader.readLine();
                String[] values = line.split("\\s+");
                String key = values [0] +"&"+values[4] +"&"+values[5]+"&"+values[6]+"&"+values[7];
                String uid = values [0];

                String strtime = values [4];
                String tty = values [5];
                String etime = values [6];
                String command =  values [7];
                Integer pid = 0;
                Integer pri = 0;
                Integer uti = 0;
                if (result.containsKey(key)) {
                    pid = (Integer) ((Object[]) result.get(key))[1];
                    pri = (Integer) ((Object[]) result.get(key))[2];
                    uti = (Integer) ((Object[]) result.get(key))[3];
                }
                else {}
                result.put(key, new Object[]{uid,pid,pri,uti,strtime,tty,etime,command});
            }
            ArrayList arrayList = new ArrayList(result.values());
            JTable table = new JTable(new PTablemodel(arrayList));
            panel.add(new JScrollPane(table));
            reader.close();
            frame.setContentPane(panel);
            frame.setVisible(true);
            frame.pack();
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();        
        }
        catch(IOException e) {
            e.printStackTrace();
        }

    }
    public static void main (String [] args){
        new Reader();
    }
    public class PTablemodel implements TableModel{

        final Class[] ColumnClass = new Class[]{String.class, Integer.class, Integer.class,Integer.class, String.class, String.class,String.class, String.class};


        final String[] columnname = new String[]{"User","PID","Priority","Utilization","TTY","StartTime","EndTime","Command"};
        List values = null;
        public PTablemodel (List values){
            this.values = values;
        }
        @Override
        public void addTableModelListener(TableModelListener l) {
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return ColumnClass[columnIndex];
        }

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

        @Override
        public String getColumnName(int columnIndex) {
            return columnname[columnIndex];
        }

        @Override
        public int getRowCount() {
            return values.size();
        } 

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

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return false;
        }

        @Override
        public void removeTableModelListener(TableModelListener l) {
        }

        @Override
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        }
    }
}

我得到的实际上不是错误,而是捕获了异常。任何人都可以指导我吗?我使用“&”作为分词器。

注意:这是编译器所说的:

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
at Reader.<init>(Reader.java:30)
at Reader.main(Reader.java:65)
4

4 回答 4

2

You are getting a NullPointerException in your while-loop that reads the input. You should test that reader.readLine() does not return null. If it does, it means you have reached the end of the input.

You could do something like this:

while((String line = reader.readLine())!=null) {
     ...
}
于 2012-06-20T09:46:53.337 回答
2

此代码是基于您的 SSCCE,表明它是文件读取代码中的内容。

读者

输出

File - exists: true I:\projects\eclipse\Test\ProcessList.txt
Frame is visible
File - exists: false I:\projects\eclipse\Test\ProcessList1.txt
java.io.FileNotFoundException: ProcessList1.txt (The system cannot find the file specified)
     ...

代码

package test.t100.t001;

import java.io.*;
import java.util.*;

import javax.swing.*;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
public class Reader {

    static String name = "ProcessList";

    public Reader(String name){
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        BufferedReader reader;
        try {
            File f = new File(name);
            System.out.println("File - exists: " + f.exists() + " " + f.getAbsolutePath());
            reader = new BufferedReader(
                    new InputStreamReader(
                            new FileInputStream(f)));
            Map<String, Object[]> result = new LinkedHashMap<String, Object[]>();
            while(reader.ready()){
                String line = reader.readLine();
                String[] values = line.split("\\s+");
                String key = values [0] +"&"+values[4] +"&"+values[5]+"&"+values[6]+"&"+values[7];
                String uid = values [0];

                String strtime = values [4];
                String tty = values [5];
                String etime = values [6];
                String command =  values [7];
                Integer pid = 0;
                Integer pri = 0;
                Integer uti = 0;
                if (result.containsKey(key)) {
                    pid = (Integer) ((Object[]) result.get(key))[1];
                    pri = (Integer) ((Object[]) result.get(key))[2];
                    uti = (Integer) ((Object[]) result.get(key))[3];
                }
                else {}
                result.put(key, new Object[]{uid,pid,pri,uti,strtime,tty,etime,command});
            }
            ArrayList arrayList = new ArrayList(result.values());
            JTable table = new JTable(new PTablemodel(arrayList));
            panel.add(new JScrollPane(table));
            reader.close();
            frame.setContentPane(panel);
            frame.setVisible(true);
            frame.pack();
            System.out.println("Frame is visible");
        }
        catch (FileNotFoundException e) {
            e.printStackTrace();        
        }
        catch(IOException e) {
            e.printStackTrace();
        }

    }
    public static void main (String [] args) throws IOException{
        String s = 
                "root         1     0  0 09:49 ?        00:00:00 init [5]\n" +  
                "root         2     0  0 09:49 ?        00:00:00 [kthreadd]\n" +
                "root         3     2  0 09:49 ?        00:00:00 [ksoftirqd/0]\n" +
                "root         4     2  0 09:49 ?        00:00:00 [kworker/0:0]\n" +
                "root         6     2  0 09:49 ?        00:00:00 [migration/0]\n" +
                "root         7     2  0 09:49 ?        00:00:00 [watchdog/0]\n";
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        FileOutputStream fos = new FileOutputStream(name + ".txt");
        fos.write(s.getBytes());
        new Reader(name + ".txt");
        new Reader(name + "1.txt");
    }
    public class PTablemodel implements TableModel{

        final Class[] ColumnClass = new Class[]{String.class, Integer.class, Integer.class,Integer.class, String.class, String.class,String.class, String.class};


        final String[] columnname = new String[]{"User","PID","Priority","Utilization","TTY","StartTime","EndTime","Command"};
        List values = null;
        public PTablemodel (List values){
            this.values = values;
        }
        @Override
        public void addTableModelListener(TableModelListener l) {
        }

        @Override
        public Class<?> getColumnClass(int columnIndex) {
            return ColumnClass[columnIndex];
        }

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

        @Override
        public String getColumnName(int columnIndex) {
            return columnname[columnIndex];
        }

        @Override
        public int getRowCount() {
            return values.size();
        } 

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

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return false;
        }

        @Override
        public void removeTableModelListener(TableModelListener l) {
        }

        @Override
        public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        }
    }
}
于 2012-06-20T09:42:19.967 回答
0

如果您收到 FileNotFoundException - 请确保将 ProcessList.txt 文件保留在项目根目录中。

在此处输入图像描述

如果您从命令提示符编译和运行它们,请确保 ProcessList.txt 文件位于 .class 文件所在的相同位置。

在此处输入图像描述

于 2012-06-20T10:23:05.423 回答
0

这个页面似乎已经改变了很多。按照我写这篇文章时的样子,你在第 30 行有一个错误的数组索引。具体来说,你正试图获取数组的元素 4 value,而且奇怪的是,它没有元素。我不是正则表达式专家,但可能是您在line.split("\\s+"). 如果这是正确的,那么您正在读取的数据有问题。您可以从打印输出line(或在调试器中检查)开始,或者只是处理实际情况。可能只是输入中有一个或多个空白或空行,当查看文件时看不到这些行,但readLine()不幸的是,确实如此。

(我经常自己写readLine,这样我就可以去掉不可打印的字符和多个换行符等等——所以我不会对任何写文件的人或他们用来写文件的软件的仁慈。但在这里你甚至可能想要忽略像“aaa”这样的行,它会通过我强迫性的 readLine。)

于 2012-06-22T18:06:05.017 回答