从具有多个对象的文本文件创建对象

Posted

技术标签:

【中文标题】从具有多个对象的文本文件创建对象【英文标题】:Creating an object from a text file with multiple objects 【发布时间】:2016-05-25 19:36:09 【问题描述】:

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

txt 文件如下所示:

3
2011
Toyota 
Corolla
2009
Honda
Civic 
2012
Honda
Accord

等等……

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

【问题讨论】:

请附上您当前拥有的代码以及问题所在。 【参考方案1】:

通常我会建议使用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();

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

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

【讨论】:

我已经完成了那部分,我知道如何阅读文本文件。我遇到的问题是我想保存汽车的每个部分;年份、名称、型号。然后我需要使用这些保存的变量并用它们创建一个对象。 我添加了使用Scanner 读取值的部分 好的,所以我尝试了代码,如果我自己设置计数,而不是从文件中读取它,它就可以工作。 所以基本上如果我把 count = 3;它工作正常,但如果我让它从文件中读取第一个数字(3)它会跳过一行,所以我的输出是 ( ,2011, toyota)(corolla, 2009, honda), etc) 我用你在上面发布的文件尝试了这段代码,它运行良好。你真的使用了这段代码并且文件中的文本相同吗?【参考方案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;
    

【讨论】:

由于我过去有过不好的经历:请注意,它不仅被接受,but desired如果你有两个不同的答案要回答两次

以上是关于从具有多个对象的文本文件创建对象的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试创建一个在循环遍历文本文件时使用变量值的类

如何从文本文件 C++ 创建对象?

从具有错误属性类型的 txt 文件创建的对象?

从Powershell中的文本文件中输入值

使用FileReader进行文本文件操作时,read方法的返回值为啥时,表示读取到文件

Python基础07 文件对象