JavaRush /Java блог /Архив info.javarush /Уровень 20, урок 1
Afli
41 уровень
Санкт-Петербург

Уровень 20, урок 1

Статья из группы Архив info.javarush
При попытке реализовать код из задачки про человека, у которого есть кот и собака возник вопрос: Собственно есть человек: class Human { public Cat cat; public Dog dog; public void save(OutputStream outputStream) throws Exception { PrintWriter writer = new PrintWriter(outputStream); String isCatPresent = cat != null ? "yes" : "no"; writer.print(isCatPresent); if (cat!=null) cat.save(outputStream); String isDogPresent = dog != null ? "yes" : "no"; writer.print(isDogPresent); if (dog != null) dog.save(outputStream); } public void load(InputStream inputStream) throws Exception { BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String isCatPresent = reader.readLine(); if (isCatPresent.equals("yes")) { cat = new Cat(); cat.load(inputStream); } String isDogPresent = reader.readLine(); if (isDogPresent.equals("yes")) { dog = new Dog(); dog.load(inputStream); } } } У него есть кот: class Cat { public String name; public int age; public int weight; public void save(OutputStream outputStream) throws Exception { PrintWriter printWriter = new PrintWriter(outputStream); printWriter.println(name); printWriter.println(age); printWriter.println(weight); printWriter.flush(); } public void load(InputStream inputStream) throws Exception { BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); name = reader.readLine(); age = Integer.parseInt(reader.readLine()); weight = Integer.parseInt(reader.readLine()); } } И есть собака: class Dog { public String name; public int age; public void save(OutputStream outputStream) throws Exception { PrintWriter printWriter = new PrintWriter(outputStream); printWriter.println(name); printWriter.println(age); printWriter.flush(); } public void load(InputStream inputStream) throws Exception { BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); name = reader.readLine(); age = Integer.parseInt(reader.readLine()); } } На первый взгляд было все понятно и логично, но уже при реализации натолкнулся на проблему: в файл не записывалась переменная isCatPresent метода save класса Human. Методом проб и ошибок я добавил строкой ниже writer.flush(); Все записывается, все чудесно. Но дальше пошли проблемы с прочтением: метод load класса Human считывает строку из файла, присваивает ее переменной isCatPresent, но при вызове метода load класса cat натыкается на конец файла. Можете объяснить особенности такой реализации сохранения/загрузки объектов?
Комментарии (2)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Vadimmm Уровень 40
8 июля 2016
То, что я InputStream поменял на BufferedReader — для удобства.
Это изменение не играет роли.
Vadimmm Уровень 40
8 июля 2016
В общем, если я не ошибаюсь, метод .flush() применяется автоматически, когда программе хочется, при переполнении буфера, и также он применяется при закрытии потока соединения.
Но конечно же его можно вызвать вручную.

Я подправил Вашу программу, всё работает. Ошибки сами увидите :)

Класс Мейн:
public class TestDrive {
    public static void main(String[] args) {

        //
        Human human = new Human();

        human.cat = new Cat();
        human.cat.name = "Kotik";
        human.cat.age = 2;
        human.cat.weight = 5;

        human.dog = new Dog();
        human.dog.name = "Pesik";
        human.dog.age = 3;

        //
        try {
            FileOutputStream fos = new FileOutputStream("c:\\temp_java\\java.txt");
            human.save(fos);
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        //
        Human human2 = new Human();
        try {
            FileInputStream fis = new FileInputStream("c:\\temp_java\\java.txt");
            BufferedReader reader = new BufferedReader(new InputStreamReader(fis));
            human2.load(reader);
            fis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        //
        System.out.println(human2.cat.name);
        System.out.println(human2.cat.age);
        System.out.println(human2.cat.weight);
        System.out.println(human2.dog.name);
        System.out.println(human2.dog.age);
    }
}

Класс Human:
public class Human
{
    public Cat cat;
    public Dog dog;

    public void save(OutputStream outputStream) throws Exception
    {
        PrintWriter writer = new PrintWriter(outputStream);

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

        if (cat