从包含多个对象的文本文件创建对象

时间:2016-02-15 01:16:56

标签: java file object text arraylist

我需要从txt文件中读取有关汽车的信息,然后将其保存到ArrayList。文件中的第一行告诉您文件中有多少辆汽车。

txt文件如下所示:

3
2011
Toyota 
Corolla
2009
Honda
Civic 
2012
Honda
Accord

依旧......

我知道如何从用户输入创建对象,但我正在尝试编辑它,因此从文件中读取它。

2 个答案:

答案 0 :(得分:3)

通常我建议使用FileReader,但是你说你正在重构从用户那里读取这些信息的代码。我想,您正在使用Scanner阅读输入,因此更改此选项的最简单方法是替换

Scanner sc = new Scanner(System.in);

用这个:

Scanner sc = new Scanner(new File("someFile.txt"));

然后您可以使用Scanner之类的内容:

String fileName = "cars.txt";
List<Car> cars = new ArrayList<>();
try (Scanner sc = new Scanner(new File("someFile.txt"))){
    int count = sc.nextInt();
    for (int i = 0; i < count; i++) {
        int year = sc.nextInt();
        String brand = sc.next();
        String type = sc.next();
        cars.add(new Car(year, brand, type));
    }
} catch (IOException e) {
    System.err.println("error reading cars from file "+fileName);
    e.printStackTrace();
}

在您从sc.hasNext()读取之前,还要使用sc.hasNextInt()Scanner,因为如果文件没有有效的内容,您的代码可能会抛出异常..

您可以在我发布的另一个(不同)答案中看到Car课程

答案 1 :(得分:2)

如果您不想重构使用Scanner的代码,可以使用FileReader执行此操作:

String fileName = "cars.txt";
List<Car> cars = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new FileReader(fileName))){
    int count = Integer.parseInt(reader.readLine());
    for (int i = 0; i < count; i++) {
        int year = Integer.parseInt(reader.readLine());
        String brand = reader.readLine();
        String type = reader.readLine();
        cars.add(new Car(year, brand, type));
    }
} catch (IOException | NumberFormatException e) {
    System.err.println("error reading cars from file "+fileName);
    e.printStackTrace();
}

请注意,您可能需要在catch块中进行适当的错误处理。读者也可以在到达文件末尾时返回null,以防万一你要验证来自文件的输入(你总是应该这样做)。

这是你的Car课程:

public class Car {
    private final int year;
    private final String brand;
    private final String type;

    public Car(int year, String brand, String type) {
        this.year = year;
        this.brand = brand;
        this.type = type;
    }

    public int getYear() {
        return year;
    }

    public String getBrand() {
        return brand;
    }

    public String getType() {
        return type;
    }
}