2012-03-07 76 views
0

所以基本上我有一个链接列表类,它具有读取文件所需的所有构造函数数据,然后将其转换为链接列表。但是,当它读入文件数据时,它会错误地添加行和空格。我正在使用system.out.println来检查它是否出错。我不认为这是toString方法,因为我已经搞砸了,没有什么改变。我需要帮助,因为我无法弄清楚。 谢谢!链接列表没有正确读取文件

文件信息(基本上,所有数据是在不同的行):

tobi 
tobi 
[email protected] 
tobi 
Mixed Breed 
Male 
3-4 
Virginia 
Walking 
lily 
lily 
[email protected] 
lily 
Yorkshire Terrier 
Female 
3-4 
Hawaii 
Jumping 
peppy 
peppy 
[email protected] 
peppy 
Chihuahua 
Male 
7-8 
Alaska 
Sleeping 
fluffy 
fluffy 
[email protected] 
fluffy 
MixedBreed 
Female 
3-4 
Virginia 
Walking 
flower 
flower 
[email protected] 
flower 
Chihuahua 
Female 
7-8 
Alaska 
Sleeping 

链接列表:从文件读取

import java.io.Serializable; 
    import java.util.*; 

    public class LinkedAccountList implements Serializable{ 

    private String username; 
    private String password; 
    private String email; 
    private String name; 
    private String breed; 
    private String gender; 
    private String age; 
    private String state; 
    private String hobby; 

    public LinkedAccountList (String username, String password, String email, String name, String breed, String gender, String age, String state, String hobby){ 
    this.username = username; 
    this.password = password; 
    this.email = email; 
    this.name = name; 
    this.breed = breed; 
    this.gender = gender; 
    this.age = age; 
    this.state = state; 
    this.hobby = hobby; 
    } 

    public String getUsername(){ 
    return username; 
    } 

    public String getPassword(){ 
    return password; 
    } 

    public String getEmail(){ 
    return email; 
    } 

    public String getName(){ 
    return name; 
    } 

    public String getBreed(){ 
    return breed; 
    } 

    public String getGender(){ 
    return gender; 
    } 

    public String getAge(){ 
    return age; 
    } 

    public String getState(){ 
    return state; 
    } 

    public String getHobby(){ 
    return hobby; 
    } 

    @Override 
    public String toString() { 
    return "Username: "+username+"\nPassword: "+password+"\nEmail: "+email+"\nName: "+name+"\nBreed: "+breed+"\nGender: "+gender+"\nAge: "+age+"\nState: "+state+"\nHobby: "+hobby; 
    } 

    public void setUsername(String u){ 
    username = u; 
    } 

    public void setPassword(String p){ 
    password = p; 
    } 

    public void setEmail(String e){ 
    email = e; 
    } 

    public void setName(String n){ 
    name = n; 
    } 

    public void setBreed(String b){ 
    breed = b; 
    } 

    public void setGender(String g){ 
    gender = g; 
    } 

    public void setAge(String a){ 
    age = a; 
    } 

    public void setState(String s){ 
    state = s; 
    } 

    public void setHobby(String h){ 
    hobby = h; 
    } 

    } 

和创建链接列表方法:

LinkedList<LinkedAccountList> account = new LinkedList<LinkedAccountList>(); 

    try 
    { 
    read(account, "file.txt"); 
    } catch (Exception e) 
    { 
    System.err.println(e.toString()); 
    } 
    display(account); 
    } 

    public static void read(LinkedList<LinkedAccountList> account, String inputFileName) throws java.io.IOException 
    { 
    BufferedReader infile = new BufferedReader(new FileReader(inputFileName)); 
    while(infile.ready()) 
    { 
    String username = infile.readLine(); 
    String password = infile.readLine(); 
    String email = infile.readLine(); 
    String name = infile.readLine(); 
    String breed = infile.readLine(); 
    String gender = infile.readLine(); 
    String age = infile.readLine(); 
    String state = infile.readLine(); 
    String hobby = infile.readLine(); 

    LinkedAccountList d = new LinkedAccountList(username, password, email, name, breed, gender, age, state, hobby); 
    account.add(d); 
    } 
    infile.close(); 
    } 

这里是输出的样子(仔细看,你可以看到这个问题):

Username: tobi 
Password: tobi 
Email: [email protected] 
Name: tobi 
Breed: Mixed Breed 
Gender: Male 
Age: 3-4 
State: Virginia 
Hobby: Walking 
Username: 
Password: lily 
Email: lily 
Name: [email protected] 
Breed: lily 
Gender: Yorkshire Terrier 
Age: Female 
State: 3-4 
Hobby: Hawaii 
Username: Jumping 
Password: peppy 
Email: peppy 
Name: [email protected] 
Breed: peppy 
Gender: Chihuahua 
Age: Male 
State: 7-8 
Hobby: Alaska 
Username: Sleeping 
Password: fluffy 
Email: fluffy 
Name: [email protected] 
Breed: fluffy 
Gender: Mixed Breed 
Age: Female 
State: 3-4 
Hobby: Virginia 
Username: Walking 
Password: flower 
Email: flower 
Name: [email protected] 
Breed: flower 
Gender: Chihuahua 
Age: Female 
State: 7-8 
Hobby: Alaska 
Username: Sleeping 
Password: null 
Email: null 
Name: null 
Breed: null 
Gender: null 
Age: null 
State: null 
Hobby: null 
+0

这不是你的问题的答案,但为什么你的类叫'LinkedAccountList'而不是'Account'? – Taymon 2012-03-07 01:16:22

+0

你的显示方式在哪里? – 2012-03-07 01:19:13

+0

我打算改变它大声笑,但没有理由 – 2012-03-07 01:19:55

回答

0

您没有任何验证,任何日志记录。 你至少应该创建方法:

public String readLine(BufferedReader br){ 
    String rl = br.readLine(); 
    if (rl.trim().length() > 2) { 
     return rl; 
    }else return readLine(br); 
} 

,并用它喜欢:

... 
    while(infile.ready()) 
     { 
      String username = readLine(infile); // instead of String username = infile.readLine(); 

而且使用这么久构造函数的参数是容易出错的

LinkedAccountList(字符串username,字符串密码,字符串电子邮件, 字符串名称,字符串品种,字符串性别,字符串年龄,字符串状态, 字符串爱好){

使用ony setX(String arg)方法。这在DAO模式中很常见。

+0

我添加了你放下的方法,在第一个帐户被读入链接列表后,正在添加另一行。我该如何做到这一点,以便当它找到一个空行时,它只是跳过它,并读取下一行? – 2012-03-07 02:06:01

+0

好吧,所以基本上我用你的方法。而且,由于Stephen C的工作,所以我将额外的行添加到了我的readfile方法中。 – 2012-03-07 02:40:40

+0

是的,我错了,它仍然没有工作 – 2012-03-07 03:34:53

0

为我工作。问题似乎是您的file.txt有一个额外的换行Walkinglily之间。仔细检查文件并确保没有文件。

+0

我的文本文件中没有多余的行或空格......它只是不能正确显示。 – 2012-03-07 01:22:24

0

问题显然不在输出端。 toString()中的错误不会导致它产生像这样的输出。

它看起来像是每个记录后输入一个额外的空行。这会导致您的read方法在循环的每次迭代中增加一行。如果这是问题,则修复方法是添加一个额外的readLine调用以跳过空白行。


在另一张纸条上,您对班级名称的选择特别差。 LinkedAccountList类不代表任何东西的列表。它代表一个帐户。

+0

好吧生病了试试吧 – 2012-03-07 01:27:22

+0

我要更改类名 – 2012-03-07 01:30:11

+0

在while循环的末尾添加一行额外帮助,但仍然存在问题。一旦到达最后两个帐户,它将跳过第二个帐户的用户名,并跳过最后一个帐户的密码。 – 2012-03-07 01:36:16