尝试将文本文件读入数组

时间:2019-11-30 04:08:57

标签: java multidimensional-array

我有一个项目,我需要帮助修复我的代码才能将文本文件读入数组。我的编码可以打开文件,但到此行时出现“ NoSuchElementException”错误,字符串contactInfo = inFS.nextLine()。trim();。如果我重新制作内部循环,它将陷入无限循环。

以下是该项目的标准,我当前的编码和一些示例数据。任何建议表示赞赏。

方法readContactsFromFile

  • 声明为公共静态方法,以“扫描仪”作为输入参数
  • 使用FileInputStream读取文件,请注意,您需要在方法声明中引发IOException
  • 返回包含MAX_SIZE(30)行和MAX_FIELDS(3)列的String多维数组
  • 向用户询问存储联系人的文件的名称。您的程序应在名称中添加“ .txt”。
  • 该方法将从文本文件“ ?????。txt”中读取数据,文件中的每一行均包含名字,姓氏和电话号码(以逗号分隔)。提示:阅读每一行后,请使用分割功能。 split函数将读取由逗号分隔的每个字段,并将其放入数组中。string contactInfo = input.nextLine()。trim(); String [] contactInfoArray = contactInfo.split(“,”);

    public static String[][] readContactsFromFile(Scanner scanner) throws IOException {
       String [][] contactsArray = new String[MAX_SIZE][MAX_FIELDS];
       String inputFileName;
       String filename;
       FileInputStream contactsStream = null; // File input stream
       Scanner inFS = null;                   // Scanner object
    
       // Try to open file
       System.out.print("Enter file name: ");
       inputFileName = scanner.next();
    
       filename= inputFileName+".txt";
       try {
           contactsStream = new FileInputStream(filename);
       } catch (FileNotFoundException e) {
    
           e.printStackTrace();
       }
       inFS = new Scanner(contactsStream);
    
       while(inFS.hasNextLine()){
           for(int row=0;row<MAX_SIZE;row++) {
               String contactInfo = inFS.nextLine().trim();
               String[] contactInfoArray = contactInfo.split(",");
    
               for(int column=0;column<MAX_FIELDS;column++) {
                   contactsArray [row][column] = contactInfoArray[column];
               }
           }  
    
       }
        return contactsArray;
    

    }

从文本文件中采样数据(没有用于分隔记录的其他行):

艾米莉·沃森,913-555-0001

Madison,Jacobs,913-555-0002

Joshua,Cooper,913-555-0003

布兰登,亚历山大,913-555-0004

Emma,Miller,913-555-0005

2 个答案:

答案 0 :(得分:1)

您的文件行数少于MAX_SIZE。如果删除for(int row=0;row<MAX_SIZE;row++),则创建一个变量row,并在每次迭代中将其递增,这将是一回事。您还需要while(inFS.hasNextLine() && row < MAX_SIZE)来进一步限制循环。

答案 1 :(得分:0)

我注意到您的代码可以通过一些帮助进行清理,因为其中有很多多余的东西,可能会引起混乱。

Scanner sc = new Scanner("Test.txt");
    String line;
    while(!(line = sc.nextLine()).equals("")){
        String[] elems = line.split(",");

        //implement the rest of the code
}

这将能够完成您要使用代码执行的所有操作。

如前所述,您阅读了两次。在这里

while(!(line = sc.nextLine()).equals(""))

通过首先调用将nextLine存储在变量行中,然后检查是否为null来解决此问题。