Java - Comment lire fichier dans la liste de tableaux d'Objets?
Je veux faire un ArrayList
de l'Étudiant et l'enregistrer dans un fichier pour une utilisation ultérieure. J'ai réussi a écrit, mais quand je l'ai lu de retour à ArrayList
, je n'ai qu'un seul Objet.
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!");
}
Quand j'ai lu le fichier en appelant getStudent()
et de l'imprimer par listStudent()
je n'ai qu'un seul enregistrement du fichier.
S'il vous plaît aidez-moi!
Beaucoup apprécient.
MODIFIER
J'avais essayé d'écrire un arraylist
de fichier et de le lire dans arraylist
. Je vais vous montrer comment je l'ai fait.
Tout d'abord, j'écris arraylist
de fichier:
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!");
Et puis j'ai lu le fichier étudiant:
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;
}
}
Je peux voir que dans le fichier, j'ai de nombreux objets que la taille du fichier de poursuivre sa croissance. Mais j'ai seulement un objet après l'avoir lu, ce qui est mon tout premier objet que j'ai écrit dans un fichier.
Merci pour votre commentaire. J'ai remarqué que, cependant j'ai ajouté le nouvel objet à l'ancien fichier, donc, techniquement, j'ai des tas d'objets dans mon fichier. FileOutputStream fos = new FileOutputStream(chemin d'accès, true);
OriginalL'auteur TomNg | 2013-11-20
Vous devez vous connecter pour publier un commentaire.
Vous de l'état en commentaire:
Alors que cette technique n'est à ajouter à la fin d'un fichier, et fonctionne parfaitement avec les fichiers de texte, je ne pense vraiment pas que cela va fonctionner ou fonctionnent bien avec la sérialisation. Je suppose que pour ajouter à la sérialisation, vous pensez d'abord à lire tous les objets dans le fichier, puis écrire sans ajout de tous via le mécanisme de sérialisation. Je re-écrire votre entrée et de sortie de code, si j'étais vous.
Modifier
Je crains que vous avez trop disparates des trucs tous entassés dans une seule classe, ce qui rend confus et difficile à déboguer le programme. Quelques recommandations générales pour aider à nettoyer cette mission:
public String toString()
méthode qui renvoie une Chaîne de caractères qui contient la valeur de l'objet.ArrayList<Student>
champ, disons appelé les étudiants.addStudent(Student student)
méthode qui permet à l'extérieur de classes à ajouter Étudiant les objets de cette classe.public String toString()
méthode qui retourne la liste de toString(), c'est à dire,return students.toString();
.public void readFromFile(File file)
méthode qui utilise la sérialisation pour lire unArrayList<Student>
à partir d'un Fichier.public void writeToFile(File file)
méthode qui utilise la sérialisation pour écrire unArrayList<Student>
à un Fichier.addStudent(...)
méthode.writeToFile(...)
de passage dans votre Fichier.Par exemple, la principale méthode pourrait ressembler le code ci-dessous. Notez bien que dans mon cas de test pour prouver que cela fonctionne, j'ai créé un simplifié Élève de la classe, celui qui a pris seulement 2 paramètres, pour les noms et les prénoms. Votre code sera évidemment prendre plus de paramètres.
mise à jour de votre question -- montrer vos dernières tentatives à la lecture de tous et l'écriture de toutes, et votre dernière problèmes avec ce code. Merci de ne pas modifier le code et de texte dans la question d'origine comme à invalider la plupart de nos réponses, mais au lieu d'ajouter un additif au fond de vos questions, et d'en notifier l'un de nous qui a répondu ou a commenté pour vous, lorsque vous avez re-posé votre question.
Merci pour votre suggestion. J'ai juste mis à jour à ma question.
veuillez voir le modifier pour répondre. Notez que si l'une de mes recommandations vont à l'encontre de votre affectation des instructions, alors postez toutes les instructions comme une modification à votre question.
Merci beaucoup pour votre très détail d'instruction. Il semble fonctionner maintenant. Je pense que je devrais séparer les choses en dehors.
OriginalL'auteur Hovercraft Full Of Eels
Je vous suggère de mettre à jour votre code de Sérialisation pour votre Étudiant de la classe (parce que vous n'êtes pas la Sérialisation de votre statique
students
) comme suit -OriginalL'auteur Elliott Frisch
Vous êtes en train de rédiger un seul Étudiant objet:
Mais essayez d'obtenir une liste de tableaux:
OriginalL'auteur user3001267