扫描程序读取文本文件时创建对象数组

时间:2014-03-14 22:05:49

标签: java text-files java.util.scanner

在上一个项目中使用我的计算机类my computer class,我应该用Java编写一个程序来读取计算机数据名称computers.txt的文件,并创建一个计算机对象的数组,到目前为止我有此

package project5;
import java.util.Scanner;
import java.io.*;


public class Project5 {


public static void main(String[] args){

    String[][] compArray = new String[50][50];
    String line = ":";
    String [] temp;

    Scanner file =null;
    try 
    {
     file = new Scanner(new File("computers.txt"));
    }
    catch(FileNotFoundException e)
    {
        System.out.println("Could not open file " + "computers.txt");
        System.exit(200);
    }

    int i = 0;
    while ((line = file.nextLine())!= null){ 
        temp = line.split(":"); 
        for (int j = 0; j<compArray[i].length; j++) {    
            compArray[i][j] = temp[j];
        }
        i++;
    }

    System.out.println(compArray[0][0]);
    }

}

现在我收到了一个错误。我做了

System.out.println(compArray[0][0]);

看看它是否正常工作但我得到了这个错误

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8
at project5.Project5.main(Project5.java:44)

computers.txt文件看起来像这样

Dell Computers Inc.:Inspiron 15 Touch:6:500:Intel Core i5:CD/DVD+-RW:Windows 8.1:649.99
Dell Computers Inc.:Inspiron 17:4:500:Intel Core i3:CD/DVD+-RW:Windows 7:549.99
Dell Computers Inc.:Alienware 18:16:1000:Intel Core i7:Dual Layer Blu-ray:Windows    7:2999.99
Acer Computers Inc.:Aspire AT3-600:6:2000:Intel Core i5:BlueRay:Windows 8:599.99

我在阅读文件时需要帮助创建数组

2 个答案:

答案 0 :(得分:0)

您已经有一个Computer类(您链接到的类)可以保存给定“计算机”的所有这些属性。

您知道文件中的每一行代表一台计算机。因此,每一行都可以用Computer(您链接到的那个)表示。

您知道如何将这些行解析为具有split()的字符串数组,并且该拆分数组中的每个元素都精确对应于“计算机”的某个属性。这意味着文件的每一行都可以生成String[],其中String[]的每个元素代表计算机的一个属性(例如,制造商是compArray[0],模型是compArray[1]等等。)。

您也知道您已拥有动态数组,例如ArrayList<Computer>

现在只需将所有这些放在一起:

  1. 从文件中读取每一行。对于每一行:
  2. 按照你现在的做法拆分它。
  3. 构建新的Computer并将拆分标记复制到相应的属性。
  4. Computer添加到动态List<Computer>
  5. 请务必妥善处理错误:如果您点击一个空白行或没有预期数量的令牌的行会怎样?

    您拥有所需的所有工具,因此请考虑如何将它们组合在一起以解决手头的问题。

答案 1 :(得分:0)

你得到的错误是因为你的for循环每次迭代50次,这意味着j将在循环结束时递增到50。现在问题出在你使用temp [j]的代码行中。由于temp将保存split()方法返回的字符串数组,因为您的computers.txt文件和正则表达式分隔符是&#34;:&#34;冒号,temp将保存一个大小为8的数组,当j变量增加到8时,你会得到ArrayIndexOutOfBoundsException:8因为temp不够大,换句话说temp没有索引8或更高

compArray[i][j] = temp[j]; // here is the problem.

试试这个

package project5;
import java.util.Scanner;
import java.io.*;


public class Project5 {
    public static void main(String[] args){

        String[][] compArray = new String[50][];// instead of new String[50][50]
        String line = ":";
        String [] temp;

        Scanner file =null;
        try 
        {
            file = new Scanner(new File("computers.txt"));
        }
        catch(FileNotFoundException e)
        {
            System.out.println("Could not open file " + "computers.txt");
            System.exit(200);
        }

        int i = 0;
        while ( file.hasNext() ){ 
            line = file.nextLine() ;
            temp = line.split(":"); 
            compArray[i] = temp ; // Since you have an array of arrays you can put the return of your split method directly in your array
            i++;
        }

        System.out.println(compArray[0][0]) ;

        System.out.println(compArray[0][7]) ;
    }
}