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

あなたのコードに基づく 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 に答える
2

入力を読み取るを取得しNullPointerExceptionています。を返さないwhile-loopことをテストする必要があります。そうであれば、入力の最後に到達したことを意味します。reader.readLine()null

次のようなことができます。

while((String line = reader.readLine())!=null) {
     ...
}
于 2012-06-20T09:46:53.337 に答える
0

FileNotFoundException が発生する場合 - ProcessList.txt ファイルをプロジェクト ルートに保持していることを確認してください。

ここに画像の説明を入力

コマンド プロンプトからコンパイルして実行する場合は、ProcessList.txt ファイルが .class ファイルと同じ場所にあることを確認してください。

ここに画像の説明を入力

于 2012-06-20T10:23:05.423 に答える
0

このページはかなり変更されているようです。私がこれを書いているように見えると、30行目に悪い配列インデックスがあります。具体的には、 array の要素 4 を取得しようとしていますがvalue、奇妙なことに、要素がありません。私は正規表現の専門家ではありませんが、余分なバックスラッシュが含まれている可能性がありますline.split("\\s+")。それが正しい場合は、読み込んでいるデータに問題があります。印刷line(またはデバッガーでのチェック) から始めるか、実際の状況を処理するだけかもしれません。入力に ​​1 つ以上の空白行または null 行がある可能性がありますが、ファイルを見たときには表示されませんがreadLine()、残念ながら表示されます。

(私はよく自分で書いているreadLineので、印刷できない文字や複数の改行などを取り除くことができます。そのため、ファイルを書いた人や、ファイルを書くのに使用したソフトウェアに翻弄されることはありません。しかし、ここでは、 「aaa」のような行は無視してください。これは、私の強迫観念的な readLine を通過する可能性があります。)

于 2012-06-22T18:06:05.017 に答える