Читаем и пишем в файл: JavaRush

  • 20
  • Недоступна
Реализуй логику записи в файл и чтения из файла для класса JavaRush. Пустых полей у объекта User быть не может. Дату в файле удобно хранить в формате long. Метод main реализован только для тебя и не участвует в тестировании.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (468)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
StrangeAngel
Уровень 27
1 февраля, 16:41
Задача интересная, но дату изначально пытался читаемо в файле сохранить. А оказалось надо именно в непонятном формате, который выдаёт метод getTime().
SVCH
Уровень 39
11 января, 10:32
Для страны прекрасно работает связка
writer.write(user.getCountry() + "\n");
.
.
user.setCountry(User.Country.valueOf(reader.readLine()));
Benjam1nBTN
Уровень 24
7 января, 17:02
Задача пушка, открылось кое-что новое. Но вот который раз уже решаю хард-задачи с первой попытки, но до сих пор остаются глупые вопросы: зачем в правильном решении везде используется this.users? Можно же просто users, разве нет? Я всегда так пишу, и валидатор принимает.
Grock
Уровень 29
12 января, 17:37
Думаю, для улучшения читаемости кода. Ключевое слово this дает понять, что переменная принадлежит объекту класса, а не классу.
Vlada
Уровень 35
22 декабря 2022, 15:35
откуда я должна догадаться, что разделителем должен быть слэш? ><
Sidroded Работает в Пивоварне
5 января, 17:34
Разделитель ты указываешь сама какой хочешь при написании метода save.
Benjam1nBTN
Уровень 24
7 января, 17:00
А можно и вовсе без разделителей обойтись, и записывать каждое значение с новой строки (как в прошлой задаче). Здесь нам показали в правильном решении, как можно оптимизировать программу, значительно уменьшив количество обращений к файлу. И это очень здорово!
Oleg Sklyar #3083937
Уровень 23
30 ноября 2022, 17:29
На удивление, решил с первого раза. Мое решение показалось мне более валидным, чем в ответах. Поделюсь, мож кому понравится. Реализация методов save и load у класса javarush:
public void save(OutputStream outputStream) throws Exception {
            if (!users.isEmpty()) {
                try (PrintWriter writer = new PrintWriter(outputStream)) {
                    for (User user : users) {
                        user.save(writer);
                    }
                }
            }
        }

        public void load(InputStream inputStream) throws Exception {
            try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {
                while (reader.ready()) {
                    this.users.add(new User());
                    users.get(users.size() - 1).load(reader);
                }
            }
        }
Реализация методов save и load у класса user:
public void save(PrintWriter writer) throws Exception {
        writer.println(this.getFirstName());
        writer.println(this.getLastName());
        writer.println(this.getBirthDate().getTime());
        writer.println(this.isMale());
        writer.println(this.getCountry().getDisplayName());
    }

    public void load(BufferedReader reader) throws Exception {
        this.setFirstName(reader.readLine());
        this.setLastName(reader.readLine());
        this.setBirthDate(new Date(Long.parseLong(reader.readLine())));
        this.setMale(Boolean.parseBoolean(reader.readLine()));
        this.setCountry(Country.valueOf(reader.readLine().toUpperCase()));
    }
Grock
Уровень 29
16 декабря 2022, 17:50
Круто! Лаконично получилось. А я решил через BufferedOutput-ы. Кода, правда раза в 3 больше.
Anton Hulevich
Уровень 37
24 декабря 2022, 14:30
если я правильно думаю то такое решение хуже в плане производительности, так как обращение к файлу и запись в него у тебя 5ть раз, а можно(нужно) сделать за один.
Андрей Федоров Android Developer
28 ноября 2022, 15:33
Не сильно легко далась задачка, все чаще приходится писать тесты и смотреть на свое творение😂
Suzuya Jūzō
Уровень 32
25 ноября 2022, 13:21
Если что не создавайте самостоятельно конструктор в User классе, пользуйтесь именно сетами, которые там определены... из-за этого валик не принимал моё решение
Данил Ильин
Уровень 34
22 ноября 2022, 17:27
Решение в 6 строчек Класс Solution.JavaRush не должен поддерживать интерфейс Serializable класс User можно 1) public class User implements Serializable 2) objectOutputStream.writeObject(users); -Записываем целый лист ( он тоже объект) 3) this.users= (List<User>) objectInputStream.readObject(); -Читаем 4) не забываем закрыть потоки
kissmylala
Уровень 41
18 ноября 2022, 05:26
Хотел проверить все ли хорошо работает, но не могу догнать как правильно инициализировать лист useroв?
Pavel V.
Уровень 41
10 ноября 2022, 11:56
user.setBirthDate(new Date(Long.parseLong(reader.readLine())));
Оставлю это тут