Чтение / запись объектов в файл, возвращающий значение null

#java #objectinputstream #objectoutputstream

#java #objectinputstream #objectoutputstream

Вопрос:

Я пытаюсь прочитать и записать объекты в файл. Чтение выходных данных в новый объект работает, но каждое значение равно null.

Вот код:

 public void read() throws Exception
    {
        try
        {
            FileInputStream fIn = new FileInputStream(file);
            ObjectInputStream in = new ObjectInputStream(fIn);

            Object obj = in.readObject();

            System.out.println(obj);
  
 public void save() throws Exception
    {
        FileOutputStream fOut = new FileOutputStream(file.toString());
        ObjectOutputStream out = new ObjectOutputStream(fOut);

        out.writeObject(this);
        out.flush();
        out.close();
    }
  

Вот выходные данные файла: (изображение выходных данных)

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

Редактировать: поскольку люди запрашивают весь класс, и я понятия не имею, какой код может быть причиной чего, вот весь класс UserFile:https://pastebin.com/Gr1tcGsg

Комментарии:

1. Является ли новый объект правильным классом? Также покажите исходный код класса, который вы сериализовали. В нем могут быть ошибки.

2. NB Вам не нужен file.toString() . Просто file подойдет. Вам также не нужно очищать перед закрытием.

3. @user207421 close вызывает сброс, и да, он все равно сбрасывает перед закрытием.

4. Хорошо, я прочитал, что он не сбрасывает. В качестве хорошей практики с потоком объектов полезно сбрасывать после записи в заголовки push. Но это общее правило конкретной реализации stream.

5. Нет, это не так. Это общее правило для ObjectOutputStream.

Ответ №1:

Я запустил этот код, и он работает, что означает, что вы, скорее всего, прочитали перед записью или получили исключение типа InvalidClassException: no valid constructor , которое имело бы смысл в вашем случае.

Код, который я запустил:

 public class SavedObject implements Serializable
{
    public static void main(String[] args) throws IOException, ClassNotFoundException
    {
        new SavedObject();
    }

    private final int random;

    private SavedObject() throws IOException, ClassNotFoundException
    {
        random = ThreadLocalRandom.current().nextInt();
        File file = new File("Object.txt");
        save(file);
        read(file);
    }

    private void save(File file) throws IOException
    {
        FileOutputStream fileOutput = new FileOutputStream(file);
        ObjectOutputStream objectOutput = new ObjectOutputStream(fileOutput);

        objectOutput.writeObject(this);
        objectOutput.close();
        fileOutput.close();

        System.out.println(this);
    }

    private void read(File file) throws IOException, ClassNotFoundException
    {
        FileInputStream fileInput = new FileInputStream(file);
        ObjectInputStream objectInput = new ObjectInputStream(fileInput);

        Object obj = objectInput.readObject();

        System.out.println(obj);

        objectInput.close();
        fileInput.close();
    }

    public String toString()
    {
        return "SavedObject(Random: "   random   ")";
    }
}
  

Который печатает:

 SavedObject(Random: -2145716528)
SavedObject(Random: -2145716528)
  

Также несколько советов для вас:

  • У вас нет try-catch, если вы throws
  • Иметь более читаемые имена переменных
  • Отправьте больше кода в вашем следующем вопросе
  • ObjectOutputStream не рекомендуется, если вы можете, вы должны записать значения такими, какие они есть
  • Не используйте throws «Исключение», вместо этого используйте throws «
  • Поместите файл вместо file.toString()

Ответ №2:

Я обнаружил проблему, она заключалась в том, что в моем конструкторе я неправильно применял полученную информацию из файла. Спасибо всем за помощь.