Java 文件读取器没有';直到最后,我才读取所有的数据

Java 文件读取器没有';直到最后,我才读取所有的数据,java,linked-list,java.util.scanner,filereader,Java,Linked List,Java.util.scanner,Filereader,在person.txt中,我们存储了此人的详细信息。 好像是这样 John Smith aösldkjf 5 8645 asdfasf 0441234545 ++++++ Adam Gilchrist ads asf asf asfd 0441234546 ++++++ 然后我们构建了FileManager类来读取该文件中的数据。 它标识有两个不同的条目。 但它总是读前8行,不会继续读下去。因此,第一个人(例如:约翰·史密斯)被两次添加到“LinkedList”中,名为AddressBook

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

John
Smith
aösldkjf
5
8645
asdfasf
0441234545
++++++
Adam
Gilchrist
ads
asf
asf
asfd
0441234546
++++++
然后我们构建了FileManager类来读取该文件中的数据。 它标识有两个不同的条目。 但它总是读前8行,不会继续读下去。因此,第一个人(例如:约翰·史密斯)被两次添加到“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");
        }
    }
}
公共类文件管理器{
公共静态void readFile(){
扫描仪x;
LinkedList tempList=新建LinkedList();
试一试{
x=新扫描仪(新文件(“Person.txt”);
@抑制警告(“未使用”)
字符串temp=null;
while(x.hasNext()){
添加(x.next());
添加(x.next());
添加(x.next());
添加(x.next());
添加(x.next());
添加(x.next());
添加(x.next());
添加(x.next());
Person=新人();
person.addFilePerson(圣殿骑士);
Main.addressBook.add(人);
}
}捕获(例外e){
System.out.println(“找不到文件”);
}
}
}
//类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);
}
public void addFilePerson(LinkedList列表){
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
,并重复添加到其中。移动此行:

LinkedList<String> tempList = new LinkedList<String>();
关于为
Person
创建“builder”类型和使
Person
自身不可变,还有其他选项,您可能希望创建一个单独的
地址
类型…

您正在创建一个
链接列表
,并重复添加到其中。移动此行:

LinkedList<String> tempList = new LinkedList<String>();
关于为
Person
创建“builder”类型和使
Person
本身不可变,还有其他选项,您可能需要创建一个单独的
地址
类型…

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

        while (x.hasNext()) {
            tempList.add(x.next());
            ...

            Main.addressBook.add(person);

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

        while (x.hasNext()) {
            tempList.add(x.next());
            ...

            Main.addressBook.add(person);

            tempList.clear();
        }

事实上,它还在继续。这一行:

person.addFilePerson(tempList);

您将
模板列表
作为参数发送,但在
addFilePerson
方法中,您总是读取
模板列表
的前7个条目。您应该在循环的每次迭代中清除
模板列表。

它实际上会继续运行。这一行:

person.addFilePerson(tempList);

您将
模板列表
作为参数发送,但在
addFilePerson
方法中,您总是读取
模板列表
的前7个条目。您应该在循环的每次迭代中清除
模板列表。

您应该使用nextLine()和hasNextLine()而不是next()和hasNext()。扫描程序是上下文感知的,因此默认令牌读取行为可能不是基于行的。

您应该使用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());

你最好还是去做

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());