2013-11-20 5 views
3

Я хочу сделать ArrayList Студента и сохранить его в файл для последующего использования. Я успешно написал его, но когда я прочитал его до ArrayList, у меня есть только один объект.Java - Как читать файл в ArrayList объектов?

public class Student implements Serializable{ 
public String fname, lname, course; 
int section; 
private static final long serialVersionUID = 1L; 

public static ArrayList<Student> students = getStudent(); 

public Student() { 
} 

public Student(String fname, String lname, String course, int section){ 
    this.fname = fname; 
    this.lname = lname; 
    this.course = course; 
    this.section = section; 
} 
public static void addStudent(){ 
    String fname = GetInput.getInput("Enter the First Name: "); 
    String lname = GetInput.getInput("Enter the Last Name: "); 
    String course = GetInput.getInput("Enter the Course: "); 
    String S_section = GetInput.getInput("Enter the section: "); 
    int section = Integer.parseInt(S_section); 
    Student student = new Student(fname, lname, course, section); 
    students.add(student); 
    System.out.println("Writing to file..."); 
    try { 
     writeToFile(student); 
    } catch (FileNotFoundException ex) { 
     System.out.println(ex.getMessage()); 
    } catch (IOException ex) { 
     System.out.println(ex.getMessage()); 
    } 
} 

public static ArrayList<Student> getStudent(){ 
    try{ 
     FileInputStream fis = new FileInputStream("C:\\students.ser"); 
     ObjectInputStream ois = new ObjectInputStream(fis); 
     ArrayList<Student> students1 = (ArrayList<Student>) ois.readObject(); 

     ois.close(); 

     return students1; 
    } catch(ClassNotFoundException | IOException ex){ 
     System.out.println(ex.getMessage()); 
     return null; 
    } 
} 
public static void listStudent(ArrayList<Student> students){ 
    System.out.println("View the Records in the Database:"); 
    for(Student student: students){ 
     System.out.println("Name: " + student.fname + " " + student.lname); 
     System.out.println("Course: " + student.course); 
     System.out.println("Section: " + student.section); 
     System.out.println(); 
    } 
} 

static void writeToFile(Student student) throws FileNotFoundException, IOException{ 
    String path = "C:\\students.ser"; 
    FileOutputStream fos = new FileOutputStream(path, true); 
    ObjectOutputStream oos = new ObjectOutputStream(fos); 
    oos.writeObject(student); 
    oos.close(); 
    System.out.println("New Record has been written!"); 
} 

Когда я прочитал файл, вызвав getStudent() и распечатать его на listStudent() У меня есть только одна запись файла.

Пожалуйста, помогите! Очень ценю.

EDIT

Я пытался писать arraylist в файл и читать его в arraylist. Я покажу вам, как я это сделал. Во-первых, я пишу arraylist в файл:

public static ArrayList<Student> students = new ArrayList<>(); 

public static void addStudent(){ 
    Student student = new Student(fname, lname, course, section); 
    students.add(student); 
    System.out.println("Writing to file..."); 
    try { 
     writeToFile(students); 
    }catch... 
} 

static void writeToFile(ArrayList<Student> students) throws FileNotFoundException, IOException{ 
    String path = "C:\\students.ser"; 
    FileOutputStream fos = new FileOutputStream(path, true); 
    ObjectOutputStream oos = new ObjectOutputStream(fos); 
    oos.writeObject(students); 
    oos.close(); 
    System.out.println("New Record has been written!"); 

А потом я прочитал студент файл:

public static ArrayList<Student> getStudent(){ 
    try{ 
     FileInputStream fis = new FileInputStream("C:\\students.ser"); 
     ObjectInputStream ois = new ObjectInputStream(fis); 
     ArrayList<Student> students1 = (ArrayList<Student>) ois.readObject(); 
     ois.close(); 
     return students1; 
    } catch(ClassNotFoundException | IOException ex){ 
     System.out.println(ex.getMessage()); 
     return null; 
    } 
} 

Я могу видеть, что в файле у меня есть много объектов, как размер файла продолжает расти. Но я прочитал только один объект, который является моим самым первым объектом, который я написал в файл.

+2

Возможно, вы только напишите одного учащегося в файл. Поэтому имеет смысл, что вы будете читать только один. –

+0

Спасибо за ваш комментарий. Я заметил, что, однако, я добавил новый объект в старый файл, так что технически у меня есть куча объектов в моем файле. FileOutputStream fos = new FileOutputStream (путь, истина); – TomNg

ответ

0

Вы ы tate в комментарии:

Спасибо за ваш комментарий. Я заметил, что, однако, я добавил новый объект в старый файл, так что технически у меня есть куча объектов в моем файле. FileOutputStream fos = new FileOutputStream (путь, истина);

Хотя это технически добавляет к концу файла и отлично работает с текстовыми файлами, я действительно не думаю, что это будет работать или работать с сериализацией. Я бы предположил, что для добавления к сериализации вам сначала нужно будет прочитать все объекты из файла, а затем написать, не добавляя их все через механизм сериализации. Я бы переписал код ввода и вывода, если бы был вами.


Редактировать
Я боюсь, что у вас слишком много разрозненных вещей все переполненной в один класс, что делает для грязных и трудно для отладки программы.Некоторые общие рекомендации, чтобы помочь очистить это назначение:

  • Сначала создать класс под названием Student - вы сделали это, - но сделать это чистый класс Student с частной фамилией, именем, раздел и поля курса, геттеры и сеттеры для этих полей (вам нужны эти), соответствующие конструкторы (думаю, у вас это есть).
  • Дайте ему достойный метод public String toString(), который возвращает строку, содержащую значения полей объекта.
  • Получите все остальное из Student, все статические методы, все ArrayLists, любой код для записи или чтения из файлов.
  • Создайте еще один класс, например, StudentCollection
  • Дайте ему частное нестатическое поле ArrayList<Student>, скажем, называемое студенчество.
  • Дайте ему метод addStudent(Student student), который позволяет внешним классам добавлять объекты Student к этому классу.
  • Дайте ему метод public String toString(), который возвращает список toString(), то есть return students.toString();.
  • Дайте ему метод public void readFromFile(File file), который использует сериализацию для чтения ArrayList<Student> из файла.
  • Дайте ему метод public void writeToFile(File file), который использует сериализацию для записи файла ArrayList<Student> в файл.
  • Наконец, создайте класс TestStudent, который имеет только один метод - общедоступный статический метод void.
  • В основном создайте объект StudentCollection.
  • Заполните его учащимися, используя ваш метод addStudent(...).
  • Создайте объект File и вызовите writeToFile(...), проходящий в вашем файле.
  • Затем тест чтения из одного файла ...

Например, основной метод может выглядеть почти как код ниже. Обратите внимание, что в моем тестовом примере, чтобы доказать, что это работает, я создал упрощенный класс учеников, в котором было всего 2 параметра, для имени и фамилии. Очевидно, что ваш код будет принимать больше параметров.

import java.io.*; 
import java.util.ArrayList; 
import java.util.List; 

public class StudentTest { 
    private static final String DATA_FILE_PATH = "myFile.dat"; 

    public static void main(String[] args) { 
     Student[] students = {new Student("John", "Smith"), 
      new Student("Mike", "Barnes"), 
      new Student("Mickey", "Mouse"), 
      new Student("Donald", "Duck")}; 

     // create our collection object 
     StudentCollection studentColl1 = new StudentCollection(); 

     // print out that it currently is empty 
     System.out.println("studentColl1: " + studentColl1); 

     // Add Student objects to it 
     for (Student student : students) { 
     studentColl1.addStudent(student); 
     } 

     // show that it is now full 
     System.out.println("studentColl1: " + studentColl1); 

     // create a file 
     File myFile = new File(DATA_FILE_PATH); 

     // write out our collection to file on disk 
     studentColl1.writeToFile(myFile); 

     // create another collection object 
     StudentCollection studentColl2 = new StudentCollection(); 

     // show that it is empty 
     System.out.println("studentColl2: " + studentColl2); 

     // read the list back into the new StudentCollection object 
     File myFile2 = new File(DATA_FILE_PATH); 
     studentColl2.readFromFile(myFile2); 

     // add a few more Student's: 
     studentColl2.addStudent(new Student("Stack", "Overflow")); 
     studentColl2.addStudent(new Student("Donald", "Trump")); 

     // show the result 
     System.out.println("studentColl2: " + studentColl2); 
    } 
} 
+0

Я все еще придерживался этой проблемы, я думал, что это будет легкий небольшой проект для меня, чтобы начать с java. Кстати, можете ли вы дать мне подсказку, как я могу прочитать все объекты из файла? – TomNg

+0

@coderkisser: обновите свой вопрос - покажите свои последние попытки прочитать все и написать все, и ваши последние проблемы с этим кодом.Пожалуйста, не изменяйте код и текст в исходном вопросе, так как это приведет к аннулированию большинства наших текущих ответов, но вместо этого добавит добавление к нижней части ваших существующих вопросов, а затем уведомит любого из нас, кто ответил или прокомментировал вам, когда вы повторно задали свой вопрос. –

+0

Благодарим вас за предложение. Я только что обновил свой вопрос. – TomNg

2

Я хотел бы предложить вам обновить свой код сериализации для вашего класса Student (потому что вы не Сериализацию вашего статического students) следующим образом -

// This controls how Student(s) will be written. 
private void writeObject(ObjectOutputStream oos) 
    throws IOException { 
    oos.defaultWriteObject(); 
    // How many students we're tracking. 
    oos.writeInt(students.size()); 
    for (Student student : students) { 
    oos.writeObject(student); 
    } 
    System.out.println("session serialized"); 
} 

// Control how we read in Student(s). 
private void readObject(ObjectInputStream ois) 
    throws IOException, ClassNotFoundException { 
    ois.defaultReadObject(); 
    // how many Students to read. 
    int size = ois.readInt(); 
    for (int i = 0; i < size; i++) { 
    Student s = (Student) ois.readObject(); 
    students.add(s); 
    } 
    System.out.println("session deserialized"); 
} 
+0

Большое вам спасибо за ваш ответ, я попробовал добавить свой код, но я получаю NullPointerException в цикле for listStudent()? Я думаю, это потому, что getStudent() возвращает значение null. любое предложение? – TomNg

0

Вы пишете один объект Student:

oos.writeObject(student); 

Но пытаются получить ArrayList:

ArrayList<Student> students1 = (ArrayList<Student>) ois.readObject(); 
+0

На самом деле я пробовал писать ArrayList в файл, и он работал, я могу видеть записи в файле. Однако, когда я читаю данные из файла, я получаю пустое исключение. – TomNg

Смежные вопросы