文件阅读器直到最后才会读取所有数据



在一个人.txt中,我们存储了这个人的详细信息。好像是这样。

John
Smith
aösldkjf
5
8645
asdfasf
0441234545
++++++
Adam
Gilchrist
ads
asf
asf
asfd
0441234546
++++++

然后我们构建了 FileManager 类来从这个文件中读取数据。它标识有两个不同的条目。但它总是读取前 8 行并且不会继续前进。因此,第一个人称(例如:- John Smith)被添加到"LinkedList"中两次,命名为AddressBook。

文件管理器类

public class FileManager {
    public static void readFile() {
        Scanner x;
        LinkedList<String> tempList = new LinkedList<String>();
        try {
            x = new Scanner(new File("Person.txt"));
            @SuppressWarnings("unused")
            String temp = null;
            while (x.hasNext()) {
                tempList.add(x.next());
                tempList.add(x.next());
                tempList.add(x.next());
                tempList.add(x.next());
                tempList.add(x.next());
                tempList.add(x.next());
                tempList.add(x.next());
                tempList.add(x.next());
                Person person = new Person();
                person.addFilePerson(tempList);
                Main.addressBook.add(person);
            }
        } catch (Exception e) {
            System.out.println("could't find the file");
        }
    }
}

类 Person 中的 addFilePerson 方法

public void addFilePerson(LinkedList<String> list){
    vorname = list.get(0);
    nachname = list.get(1);
    strasse = list.get(2);
    hausnummer = list.get(3);
    plz = list.get(4);
    telefon = list.get(5);
    wohnort = list.get(6);
}

您正在创建一个LinkedList<String>并反复添加它。移动此行:

LinkedList<String> tempList = new LinkedList<String>();

进入while循环。或者 - 最好是IMO - 为不同的部分使用单独的属性:

// TODO: Consider what happens if the file runs out half way through a person...
while (x.hasNext()) {
    Person person = new Person();
    person.setFirstName(x.next());
    person.setLastName(x.next());
    person.setStreet(x.next());
    person.setTown(x.next());
    person.setTelephoneNumber(x.next());
    person.setCity(x.next()); // Or whatever...
    Main.addressBook.add(person);
}

在为Person创建"生成器"类型并使Person本身不可变方面还有其他选项,您可能希望创建一个单独的Address类型...

您应该在从文件中读取人员之间清除(或重新创建)您的列表。否则,您将继续将同一个人(您阅读的第一个人)添加到地址簿中。因此,要么按照 Jon 的建议每次在循环中重新创建您的临时列表,要么在每轮后清除它:

        while (x.hasNext()) {
            tempList.add(x.next());
            ...
            Main.addressBook.add(person);
            tempList.clear();
        }

它实际上继续前进。这一行:

person.addFilePerson(tempList);

您将tempList作为参数发送,但在addFilePerson方法中,您始终读取tempList的前 7 个条目。您应该清除循环每次迭代中的tempList

你应该使用 nextLine() 和

hasNextLine() 而不是 next() 和 hasNext()。扫描程序具有上下文感知功能,因此默认令牌读取行为可能不是基于行的。

最好这样做

Person person = new Person();
Address address = new Address();
person.setAddress(address);
person.setFirstName(x.next());
person.setLastName(x.next());
address.setStreetName(x.next());
address.setHouseNumber(x.next());
address.setZipCode(x.next());
person.setPhoneNumber(x.next());
address.setCityName(x.next());

相关内容

  • 没有找到相关文章

最新更新