扫描程序,用于输入文件并将来自输入文件的数据对象存储在数组中

时间:2019-04-07 15:36:58

标签: java arrays java.util.scanner

基本上,我必须为给定文件创建一个扫描程序,并在计算完文件中的行数后通读该文件(名称由用户通过终端输入)。然后,我不得不从文件中创建一个对象数组,其大小正确(行数进入其中)。然后,我必须为该文件创建另一个扫描程序,然后再次通读它,并将其存储在我创建的阵列中。最后,必须在方法中返回数组。

我的问题是我似乎无法让第二台扫描仪真正将文件对象存储在阵列中。

我尝试在for循环中使用.nextLine,该循环也调用该数组,但似乎不起作用。

public static Data[] getData(String filename) {

            Scanner input = new Scanner(new File(filename));
            int count = 0;
                while (input.hasNextLine()) {
                input.nextLine();
                count++;
                } 
                System.out.println(count);

         Data[] data = new Data[count]; 
         Scanner input1 = new Scanner(new File(filename));          
           while (input1.hasNextLine()) {
                for (int i = 0; i < count; i++) {
                    System.out.println(data[i].nextLine);
                } 
            } 
         return data;
  }

我希望输出成功读取输入文件,以便可以用我创建的其他方法(未显示)对其进行访问。

4 个答案:

答案 0 :(得分:0)

不清楚您的意思是Data.class,如果将其切换为String,则问题显然出在此行

System.out.println(data[i].nextLine);

如果您想同时分配和打印,请写

 for (int i = 0; i < count; i++) {
     data[i] = input1.next();
     System.out.println(data[i]);
 }

也不要忘记关闭扫描仪,最好使用try-with-resources。 如果您的数据是自定义类,则最好了解Serialization-Deserialization 或使用一些ObjectMapper-s(例如Jackson)来存储您的类实例并还原它们。

答案 1 :(得分:0)

您打开文件只是为了计算行数,然后再次循环遍历文件的行以将它们存储在数组中的方式效率不高,但这可能只是学校的作业。
试试这个:

public static Data[] getData(String filename) {
    Scanner input = null;
    try {
        input = new Scanner(new File(filename));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        return null;
    }
    int count = 0;
    while (input.hasNextLine()) {
        input.nextLine();
        count++;
    }
    input.close();
    System.out.println(count);

    Data[] data = new Data[count];
    try {
        input = new Scanner(new File(filename));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        return null;
    }
    for (int i = 0; i < count; i++) {
        Data d = new Data(input.nextLine(), 0, 0);
        data[i] = d;
        System.out.println(data[i].name);
    }
    input.close();
    return data;
}

在第一个循环之后,您必须关闭Scanner并重新打开它,以便从文件的第一行重新开始。

答案 2 :(得分:0)

如果您没有IDE,则绝对应该使用IDE,请尝试使用intellij ...那里有自动补全和语法检查等功能。

不清楚要在for循环中做什么,因为存在多个错误,例如readline()函数仅适用于扫描仪对象,因此您可以执行input.nextline()或input1 .nextline()`...

所以我只向您展示如何使用扫描仪从文件中获取数据:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class Readfile {

    public static void getData(String filename) throws FileNotFoundException {

        ArrayList<String> test = new ArrayList<>(); //arraylist to store the data

        Scanner inputSc = new Scanner(new File(filename)); //scanner of the file

        while (inputSc.hasNextLine()) {
            String str = inputSc.nextLine();
            System.out.println(str); //print the line which was read from the file
            test.add(str); //adds the line to the arraylist
            //for you it would be something like data[i] = str; and i is a counter
        }
        inputSc.close();

    }

    public static void main(String[] args) {

        try {
            getData("/home/user/documents/bla.txt"); //path to file
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }

}

答案 3 :(得分:0)

您不需要两次读取文件-只需使用ArrayList来保存来自文件的数据,就像这样,然后最后返回Data []:

public static Data[] getData(String filename) {
     List<Data> result = new ArrayList<>();
     try (Scanner input = new Scanner(new File(filename))){
        while (input.hasNextLine()) {
            Data data = new Data(input.nextLine());
            result.add(data);
        } 
     }

     return result.toArray(new Data[0]);

}