尝试从文本数据中读取数据并从中构建对象


public void getAnimalsFromTextFile() throws IOException {
String file = "C:\Users\nikit\OneDrive\Desktop\animals.txt";
BufferedReader inFile = new BufferedReader(new FileReader(file));
String line;
int cnt = 0;
while ((line = inFile.readLine()) != null) {
StringTokenizer st = new StringTokenizer(line,"");
if(st.hasMoreTokens()) {
String line1 = st.nextToken();
StringTokenizer st1 = new StringTokenizer(line1, " ");
while (st1.hasMoreTokens()) {
String att = st1.nextToken();
strings.add(att);
}
}
}
}

这个文本文件是:

Jackie Jack Boston
Marty Bird California
Donald Duck Netherlands

我想从这个文件中构建3个Animal对象,如:

Animal animal =  new Animal(Jackie, Jack, Boston);

然后将它们添加到数组中。

在and中,我想将动物对象存储在数组中。

您在问题中写道:

我想构建3个动物对象

这意味着你想要一个名为Animal的类,它有三个属性,即

public class Animal {
private String first;
private String second;
private String third;
}

请注意,从你的问题中我无法确定每个属性代表什么,因此我将它们命名为first,secondthird

现在你想为你的类写一个构造函数:

public Animal(String first, String second, String third) {
this.first = first;
this.second = second;
this.third = third;
}

你还在你的问题中写道:

我想把动物对象存储在数组

数组有一个固定的大小,在声明时提供。因为你是从一个文件中读取,你可能不知道它的大小,因此最好使用List。

在Java中读取文件时,在完成读取文件后,应该关闭它。从Java 7开始,有了try-with-resources。

也因为Java 7有Files类,这是NIO.2的一部分。

StringTokenizer是一个遗留类。新代码应该使用java.lang.String类的split方法。

下面是实现您想要的示例代码。

import java.io.BufferedReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
public class Animal {
private String first;
private String second;
private String third;
public Animal(String first, String second, String third) {
this.first = first;
this.second = second;
this.third = third;
}
public static void getAnimalsFromTextFile() throws IOException {
List<Animal> animals = new ArrayList<>();
Path path = Paths.get("animals.txt");
try (BufferedReader inFile = Files.newBufferedReader(path)) {
String line = inFile.readLine();
while (line != null) {
String[] strings = line.split(" ");
Animal animal = new Animal(strings[0], strings[1], strings[2]);
animals.add(animal);
line = inFile.readLine();
}
}
}
}

或者,您可以使用Java 8中引入的流。

public static void getAnimalsFromTextFile() throws IOException {
Path path = Paths.get("animals.txt");
try (Stream<String> stream = Files.lines(path)) {
List<Animal> animals = stream.map(line -> line.split(" "))
.map(array -> new Animal(array[0], array[1], array[2]))
.collect(Collectors.toList());
}
}

创建一个包含三只动物的类,这将是

class Animal {

private String animal1; 
private String animal2; 
private String animal3;
public Animal(String animal1, String animal2, String animal3) {
super();
this.animal1 = animal1;
this.animal2 = animal2;
this.animal3 = animal3;
}
@Override
public String toString() {
return "Animal [animal1=" + animal1 + ", animal2=" + animal2 + ", animal3=" + animal3 + "]";
}
}

在你的循环中(当读取文件时)

  1. 用空格分隔当前行(" ")并获得一个元素数组

  2. 将每个数组元素分别传递给你的动物构造函数。

  3. 一旦你有了对象,将它分配给索引为cnt的数组。

    公共类AnimalManager {

    public static void main(String[] args) {
    
    try (BufferedReader inFile = new BufferedReader(new FileReader("animals.txt"));) {
    String line;
    int cnt = 0;
    Animal[] animalArray = new Animal[10];
    while ((line = inFile.readLine()) != null) {
    String animalsInLine[] = line.split(" ");
    animalArray[cnt++] = new Animal(animalsInLine[0], animalsInLine[1], animalsInLine[2]);
    }
    System.out.println(java.util.Arrays.toString(animalArray));
    } catch (IOException e) {
    System.out.println("Error while file handling : " + e.getMessage());
    }
    }
    

最新更新