Java-从文件中读取结构松散的数据

时间:2018-12-05 18:27:15

标签: java arrays serialization file-io filereader

我目前正在尝试学习Java代码的行为方式以及如何处理输入和输出文件。我了解如何逐行读取文件内容并将其放入数组,但我很难理解如何从文件中读取每n行出现的某些值,然后将其放入数组中。 例如,我有一个输入测试文件,如下所示:

2
Australia
John
42
Blue
USA
Jeremmy
15
Black

第一行是数组的大小。以下几行是我想从文件中读取的内容,并将其放入所述数组中(在此示例中,我将其为:国家/地区,名称,年龄,眼睛颜色)。换句话说,我想读取每四行出现的一些对象属性,以便稍后在选择时可以打印出来,例如其中一个人。 现在,我被困在这里,不知道如何前进,因为大多数人没有尝试对这样的文件进行操作。

   private static String[] readPeople(File file) {
    try (BufferedReader br = new BufferedReader(new FileReader(file))) {
        String sizeText = br.readLine();
        int size = Integer.parseInt(sizeText);
        String[] peopleSet= new String[size];

        for (int i = 1; i < size; i++) {
            if (i % 2 != 0) {
                String peopleInfo= br.readLine();
                peopleSet[i] = peopleInfo;
            }
        }
        return peopleSet;
    } catch (IOException ex) {
        System.err.println(ex);
        return new String[0];
    }
}

3 个答案:

答案 0 :(得分:1)

用冒号分隔行可能更容易

在文件中的值之间用冒号分隔条目吗?

Australia:John:42:Blue
USA:Jeremmy:15:Black

然后在您的文件解析器中:

private static List<Person> readPeople(File file) {
    List<Person> people = new ArrayList<>();
    try (BufferedReader br = new BufferedReader(new FileReader(file))) {
      String line = "";
      while((line = br.readLine()) != null) {
        String[] args = line.split(":");
        String country = args[0];
        String name = args[1];
        int age = Integer.parseInt(args[2]);
        String eyeColor = args[3];

        Person p = new Person(name, country, age, eyeColor);
        people.add(p);
      }
    } catch (IOException ex) {
      System.err.println(ex);
    } 
    return people;
}

最后定义Person类

class Person {
   String name;
   String country;
   int age;
   String eyeColor;

   public Person(String name, String country, int age, String eyeColor) {
      this.name = name;
      this.country = country;
      this.age = age;
      this.eyeColor = eyeColor;
   }

   @Override
   public String toString() {
     return String.format("%s:%s:%d:%s", country, name, age, eyeColor);
   }
}

根据需要添加错误检查和获取/设置程序

这将返回文件中定义的人员列表,您可以通过在返回列表对象上调用.size()来检查人员列表的大小。

更新

添加了toString()替代项,以创建将冒号写到文件或控制台时的单独的条目

希望这会有所帮助

答案 1 :(得分:0)

我为您提供此代码。

    File Read_File = new File("file_path"); 

    BufferedReader br = null;

    try {
        br = new BufferedReader(new FileReader(Read_File));
        String line;
        int line_number = 0;

        int size = Integer.parseInt(br.readLine());



        for (int try_ = 0; try_ < size; try_++) {
            String read = br.readLine();
            for(int try_four = 0; try_four<4; try_four++) {
                //save input operation
            }
        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (br != null)
            try {
                br.close();
            } catch (IOException e) {
            }
    } 

但是使用列表是最好的方法。

答案 2 :(得分:0)

问题是您的代码仅在条件为true时才从文件读取。不管循环执行多少次,文件内容只会在您实际使用br.readLine()进行阅读时才会前进。

for (int i = 1; i < size; i++) {
    if (i % 2 != 0) {
        String peopleInfo= br.readLine();
        peopleSet[i] = peopleInfo;
    }
}

也不清楚您要阅读哪些行。该代码将循环size次(2),但每隔两次仅读取一行,因此将仅读取“ Australia”。

如果您想阅读这些人的名字(“约翰”和“杰里米”),它们是每四人一组中的第三行,则可以这样做:

for (int i = 1; i < size; i++) {
    for (int j = 0; j < 4; j++) {
        String line = br.readLine();
        if (j % 4 != 2) {
            people[i] = line;
        }
    }
}

这将读取所有八行(从“澳大利亚”到“黑色”)。对于每个人,j的值将从03;因此,第三行是j % 4 == 2

它将名称存储到长度为2的数组people中。我从peopleSet重命名了它,因为它不是Java Set。原始名称具有误导性。