2012-04-11 1 views
0

В файле person.txt мы сохранили данные этого человека. Кажется, что.File Reader не считывает все данные до конца

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"); 
     } 
    } 
} 

метод // addFilePerson // Файл в классе Person

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

ответ

1

Вы создаете один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 тип ...

1

Вы должны очистить (или воссоздать) ваш список между чтением лиц из файла. В противном случае вы добавите в адресную книгу того же человека (первый, который вы прочитали). Поэтому либо обновляйте свой временный список в цикле каждый раз, как предложил Джон, либо очистите его после каждого раунда:

+0

только одну строку кода. работает отлично. –

1

Это действительно движение. Эта линия:

person.addFilePerson(tempList); 

вы посылаете tempList в качестве параметра, но в addFilePerson методе вы всегда прочитать первые 7 записей, которые tempList «s. Вы должны очистить tempList на каждой итерации цикла.

0

Вы должны использовать nextLine() и hasNextLine() вместо next() и hasNext(). Сканер контекстно-зависим, поэтому поведение чтения токенов по умолчанию может не основываться на строках.

0

Вы бы лучше делать

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