JavaRush /Курсы /Java Core /Сохранение массива объектов

Сохранение массива объектов

Java Core
10 уровень , 1 лекция
Открыта

— Привет, Амиго! Сегодня мы познакомимся с еще одной интересной темой. А именно: сохранением и загрузкой (восстановлением) объектов. Допустим у нас есть класс Cat:

Код
class Cat {
    public String name;
    public int age;
    public int weight;
}

И мы хотим добавить в него удобный механизм сохранения в файл и загрузки из файла.

Вот как это можно сделать:

Код
class Cat {
    public String name;
    public int age;
    public int weight;

    public void save(PrintWriter writer) throws Exception {
        writer.println(name);
        writer.println(age);
        writer.println(weight);
        writer.flush();
    }

    public void load(BufferedReader reader) throws Exception {
        name = reader.readLine();
        age = Integer.parseInt(reader.readLine());
        weight = Integer.parseInt(reader.readLine());
    }
}

— О! Это же очень просто. Мы просто печатаем значения всех аргументов, по одному в каждой строчке. А при загрузке читаем их в том же порядке. Отличное решение.

— Спасибо, Амиго. А можешь написать, как будут выглядеть методы save и load у такой группы классов:

Код
class Cat {
    public String name;
    public int age;
    public int weight;
}
class Dog {
    public String name;
    public int age;
}
class Human {
    public Cat cat;
    public Dog dog;
}

У тебя есть объект человек, и он может иметь одну собаку и одного кота.

— У меня есть решение:

Код
class Cat {
    public String name;
    public int age;
    public int weight;

    public void save(PrintWriter writer) throws Exception {
        writer.println(name);
        writer.println(age);
        writer.println(weight);
        writer.flush();
    }

    public void load(BufferedReader reader) throws Exception {
        name = reader.readLine();
        age = Integer.parseInt(reader.readLine());
        weight = Integer.parseInt(reader.readLine());
    }
}
Код
class Dog {
    public String name;
    public int age;

    public void save(PrintWriter writer) throws Exception {
        writer.println(name);
        writer.println(age);
        writer.flush();
    }

    public void load(BufferedReader reader) throws Exception {
        name = reader.readLine();
        age = Integer.parseInt(reader.readLine());
    }
}
Код
public class Human {
    public Cat cat;
    public Dog dog;

    public void save(PrintWriter writer) throws Exception {
        cat.save(writer);
        dog.save(writer);
    }

    public void load(BufferedReader reader) throws Exception {
        cat.load(reader);
        dog.load(reader);
    }
}

— Очень хорошее решение. Но что будет, если у человека нет кота, а есть только собака?

Где проверки на null?

— Сейчас исправлю:

Код
public class Human {
    public Cat cat;
    public Dog dog;

    public void save(PrintWriter writer) throws Exception {
        if (cat != null)
            cat.save(writer);
        if (dog != null)
            dog.save(writer);
    }

    public void load(BufferedReader reader) throws Exception {
        cat = new Cat();
        cat.load(reader);
        dog = new Dog();
        dog.load(reader);
    }
}

— Все равно не очень верно. У тебя две ошибки:

1) Если у человека нет ни кота, ни собаки, они все равно будут созданы, при вызове метода load

2) Если мы сохраним только собаку, то ее данные будут прочитаны котом при загрузке.

— А что же делать?

— Мы не можем пропускать запись переменных, иначе это вызовет сбой при чтении. Но нужно сделать так, чтобы переменные, чье значение было null при сохранении и после загрузки, получали null. Вот мой вариант:

Код
public class Human {
    public Cat cat;
    public Dog dog;

    public void save(PrintWriter writer) throws Exception {
        String isCatPresent = cat != null ? "yes" : "no";
        writer.println(isCatPresent);
        writer.flush();

        if (cat != null)
            cat.save(writer);

        String isDogPresent = dog != null ? "yes" : "no";
        writer.println(isDogPresent);
        writer.flush();

        if (dog != null)
            dog.save(writer);
    }

    public void load(BufferedReader reader) throws Exception {

        String isCatPresent = reader.readLine();
        if (isCatPresent.equals("yes")) {
            cat = new Cat();
            cat.load(reader);
        }

        String isDogPresent = reader.readLine();
        if (isDogPresent.equals("yes")) {
            dog = new Dog();
            dog.load(reader);
        }
    }
}

— Да, мне нравится такое решение.

— Да, что-то в нем есть.

Комментарии (215)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Дмитрий Сергеевич Уровень 22 Expert
18 сентября 2025
А для меня вообще ни чего здесь не понятно. Очень все кратко. Тема тяжелая и можно было бы подробней все расписать. Я как новичок, не сразу пойму, что и куда делать. Попробовал применить код и в итоге не чего не получилось.
Anonymous #3585174 Уровень 33
16 сентября 2025
like
5 мая 2025
я как новичок, хоть и понял работу с Паттернами\сериализацией, но мне лично не хватает определения этих слов, если не мои друзья наставники так бы и гадал что значат названия лекции или же где-то в курсе я пропустил эти понятия, подскажите)
Денис Кокшаров Уровень 32
21 марта 2025
че эта вдруг до 30ого уровня не было проверок, а тут на тебе)
Mikhail Tabakaev Уровень 31
26 сентября 2024
абстрактный класс Animal, от которого наследуются Cat и Dog почему не реализован в лекции?
Jsuccess Уровень 30
20 декабря 2024
Зачем, если у нас фокус на других вещах?
Mikhail Tabakaev Уровень 31
26 декабря 2024
ПОТОМУ ЧТО... Принцип DRY гласит: D - Dont R - Repeat Y - Yourself.
Денис Кокшаров Уровень 32
21 марта 2025
лучше тебе не знать о чем гласит принцип SYFM...
Mikhail Tabakaev Уровень 31
28 марта 2025
простите, сэр, но этот принцип скорее не относится с компуктерным наукам... если я не ошибся
Денис Кокшаров Уровень 32
31 марта 2025
спасибо, бро) ловко лавируешь) мы и не узнаем ошибся или нет, получается, потому что подуманное осталось за кадром в обоих случаях!)))
Ика Уровень 36
18 мая 2024
Комментаторы конечно удивляют. У меня мозги чуть не вытекли от предыдущих задач, во многих из которых я заходил в комментарии и недоумевал от отсутсвия непонимания (например в задачке про теги в html файле). Но тут довольно простецкий код - опускаю вниз к комментам и я в шоке с того, какие проблемы эта статья вызвала.
Максим Li Уровень 40
10 мая 2024
10.05.2024
Snaret Уровень 38
18 марта 2024
То чувство когда прочитав комментарии понимаешь больше чем за прочитанную лекцию... Не туда платим.
Dmitriy Kvitka Уровень 31
24 февраля 2024
Ну последний код работает только при условии, что в сохраненных данных четко указано отсутствие или наличие обоих животных. А если кот - YES, а про собаку ничего не упомянули - нет собаки, нет информации. А то выглядит не очень: "Привет! У меня есть кот, но нет собаки." Ну нет собаки, Ок, зачем об этом распространяться)))) Тогда вместо Yes/No лучше указывать "Cat" или "Dog", чтобы понимать, что следующая информация о коте или собаке, или об обоих.
Silent Rider Уровень 1
12 марта 2024
Да согласен, а еще лучше хранить информацию об объектах Cat и Dog в отдельных файлах, чтобы их не перепутать
Anonymous #3390940 Уровень 38
10 февраля 2024
🦝