#java #file #object #save #serializable
#java #файл #объект #Сохранить #сериализуемый
Вопрос:
Это была моя первая попытка сохранить объект в файле, поэтому я понятия не имею, где я ошибаюсь. Это всего лишь тестовая программа, исходная намного больше. Сохранение выполнено успешно, файл резервной копии создан. Однако, похоже, я не могу вспомнить этот файл / объект. Компиляция работает. Может кто-нибудь, пожалуйста, объясните, где именно я ошибся. И, пожалуйста, в немного более «учебном пособии для начинающих», я действительно плохо разбираюсь в «сериализуемом»
import java.io.*;
import java.util.*;
class save {
public static void main(String[] args) {
HashMap<String, Person> list = new HashMap<String, Person>();
Person person = new Person("12", "AAA", "XXX");
list.put(person.getID(), person);
if( list.containsKey(person.getID()))
System.out.println(list.get(person.getID()));
savePerson(person);
list.remove(person.getID());
if( list.containsKey(person.getID()))
System.out.println(list.get(person.getID()));
else
System.out.println("Person is not available");
person = loadPerson("12");
System.out.println(list.size());
}
protected static void savePerson(Person person) {
File source = new File("person" person.getID() ".data");
try { source.createNewFile(); } catch(IOException e) {System.out.println("Can't create new file : " e.getMessage());}
try {
FileOutputStream personFile = new FileOutputStream("person" person.getID() ".data");
try {
ObjectOutputStream personObj = new ObjectOutputStream (personFile);
personObj.writeObject(person);
personObj.close();
personFile.close();
} catch(IOException e){System.out.println("Can't save the object :" e.getMessage());}
} catch(FileNotFoundException e){System.out.println("Can't read the damn file :" e.getMessage());}
}
protected static Person loadPerson(String ID) {
Person person = null;
try {
FileInputStream personFile = new FileInputStream("person" ID ".data");
try {
ObjectInputStream personObj = new ObjectInputStream(personFile);
try {
person = (Person)personObj.readObject();
personObj.close();
personFile.close();
} catch(ClassNotFoundException e){System.out.println("Can't find the class :" e.getMessage());}
} catch(IOException e){System.out.println("Can't save the object :" e.getMessage());}
} catch(FileNotFoundException e){System.out.println("Can't read the damn file :" e.getMessage());}
return person;
}
}
РЕДАКТИРОВАТЬ: вот класс person в запросе:
import java.io.*;
class Person implements Serializable {
private String id;
private String fname;
private String lname;
public Person(String id, String fname, String lname) {
this.id = id;
this.fname = fname;
this.lname = lname;
}
protected String getID() { return id; }
protected String getFname() { return fname; }
protected String getLname() { return lname; }
protected void setFname(String newFname) { fname = newFname; }
public String toString() {
return id ", " fname " " lname;
}
}
Комментарии:
1. Вы игнорируете там довольно много исключений. Вы уверены, что ни один из них не был выброшен?
2. Попробуйте напечатать e.GetMessage() во всех уловах. Вы никогда не закрываете файл?
3. возможно, было бы неплохо также предоставить класс Person . @vedran
4. @Zohaib Я добавил класс person, хотя сомневаюсь, что это вызывает всю проблему
5. @AdamZalcman, да, я перепробовал их все и не получил ни одной ошибки.
Ответ №1:
Закройте файл после записи в него. Вероятно, вы не получаете доступа к файлу. Кроме того, если вы заполните пустые блоки catch печатью исключения, вы будете ближе к поиску проблемы.
Вы можете закрыть его, вызвав personFile.close()
(и то же самое после чтения объекта)
РЕДАКТИРОВАТЬ: я протестировал ваш (новый) код, и он работает просто отлично. Я смог прочитать объект, но ваш код ничего с ним не делает.
Кстати, вам не нужно закрывать оба потока, как указано в close
:
Если этот поток имеет связанный канал, то канал также закрывается.
Комментарии:
1. Не могли бы вы рассказать мне, как это сделать? Опять же, я прошу прощения за невежество, но студент первого курса здесь … 🙂
2. Я добавил как personObj.close(); и personFile.close(); но больше ничего не происходит…
3. Я обновил код с помощью завершающих операторов, использовал ли я их в нужное время? см. Исходное сообщение
4. Хорошо, поэтому я забыл поместить его обратно в HashMap, большое дело… Шутки в сторону, спасибо за помощь.