evgeniy8705
@evgeniy8705
Повелитель вселенной

Почему выводится не то что нужно (Ввод вывод данных)?

Реализация декоратора была дана. Задание заключалось в написании адаптера. Вроде как написал. Но при использовании выводится не то что нужно. Можете подсказать где ошибки реализации (хотя возможно и ошибки использования)? Как написать все таки правильно этот адаптер?

Результат выполнения программы:

Person(, 0) // А должно быть Person(Alex, 28)

Полный код:

import java.io.*;

class Point {
    private final int x;
    private final int y;

    public Point(int x, int y) {
        if (x < 0 || 15 < x) {
            throw new IllegalArgumentException();
        }

        if (y < 0 || 15 < y) {
            throw new IllegalArgumentException();
        }

        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    @Override
    public String toString() {
        return "Point(" + x + ", " + y + ")";
    }
}

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Person(" + name + ", " + age + ")";
    }
}

interface EntityInput {
    public Person readPerson() throws IOException;
    public Point readPoint() throws IOException;
}

interface EntityOutput {
    public void writePerson(Person person) throws IOException;
    public void writePoint(Point point) throws IOException;
}

class EntityOutputStream implements EntityOutput {
    private final DataOutput out;

    public EntityOutputStream(OutputStream out) {
        this.out = new DataOutputStream(out);
    }

    @Override
    public void writePerson(Person person) throws IOException {
        out.writeInt(person.getAge());

        if (person.getName() == null) {
            out.writeBoolean(false);
        } else {
            out.writeBoolean(true);
            out.writeUTF(person.getName());
        }
    }

    @Override
    public void writePoint(Point point) throws IOException {
        int value = point.getX() << 4 | point.getY();

        out.writeByte(value);
    }
}

class EntityInputStream implements EntityInput {
    private final DataInput src;

    public EntityInputStream(InputStream src) {
        this.src = new DataInputStream(src);
    }

    @Override
    public Person readPerson() throws IOException {
        return new Person(src.readUTF(), src.readByte());
    }

    @Override
    public Point readPoint() throws IOException {
        return new Point(src.readByte(), src.readByte());
    }
}

public class App {
    public static void main(String[] args) throws IOException {
        Person person = new Person("Alex", 28);

        EntityOutputStream out = new EntityOutputStream(new FileOutputStream("c://file.txt"));
        EntityInput in = new EntityInputStream(new FileInputStream("c://file.txt"));

        out.writePerson(person);

        System.out.println(in.readPerson());
    }
}
  • Вопрос задан
  • 144 просмотра
Пригласить эксперта
Ответы на вопрос 1
@red-barbarian
записываем int, bool, str
читаем str, byte
надо что-то такое
@Override
    public Person readPerson() throws IOException {
        int age = src.readInt();
        boolean notNull = src.readBoolean();
        String name = null;
        if (notNull) name = src.readUTF();
        return new Person(name, age);
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы