Java, сохраненный файл в объекте, не может получить его

Это был мой первый раз, когда я пытался сохранить объект в файл, поэтому я понятия не имею, где я иду не так. Это всего лишь тестовая программа, оригинальная намного больше. Сохранение выполнено успешно, файл резервной копии создан. Однако я не могу вспомнить этот файл / объект. Компиляция работает, хотя. Может кто-нибудь объяснить, пожалуйста, где именно я пошел не так. И в немного более стиле для начинающих, пожалуйста, мне действительно плохо с "Serializable"

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

РЕДАКТИРОВАТЬ: Вот человек класса по запросу:

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 ответ

Решение

Закройте файл после записи в него. Вы, вероятно, не получите доступ к файлу. Кроме того, если вы заполните пустые блоки catch печатью исключения, вы будете ближе к проблеме.

Вы можете закрыть его, позвонив personFile.close() (и то же самое после прочтения объекта)

РЕДАКТИРОВАТЬ: Я проверил ваш (новый) код, и он работает просто отлично. Я смог прочитать объект, но ваш код ничего не делает с ним.

Кстати, вам не нужно закрывать оба потока, как указано в close:

Если у этого потока есть связанный канал, то канал также закрыт.

Другие вопросы по тегам