Учитель diego

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

  • 11
  • Недоступна
А теперь пороемся в файлах студентов… И реализуем логику записи в файл/чтения из файла для класса JavaRush с данными учеников. Метод main реализован только для вас и не участвует в тестировании.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (236)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
виктор20 уровень, Москва
воскресенье, 11:02
Кто, как и я, ничего не понял в переопределении equals и hashCod (и откуда там появляется число 31) - бежим сюда: Тыц! Тыц!
Тимур20 уровень, Москва
четверг, 18:37
Увидел в комментах внизу и возник вопрос - Кто нибудь пробовал решить методами ObjectInputStream/ObjectOutputStream, интересно валидатор примет их? Пример использования класса ObjectOutputStream http://java-online.ru/java-outputstream.xhtml Пример использования класса ObjectInputStream http://java-online.ru/java-inputstream.xhtml
Тимур20 уровень, Москва
четверг, 17:48
Кто подскажет, чем эффективнее записывать данные PrintWritter или OutputStream???? Вроде как PrintWritter создает дополнительную сущность... 😕 Кто в курсе, что лучше брать на вооружение? 🤕
Константин Петров20 уровень, Москва
10 сентября, 08:20
Война с валидатором продолжается. На что я напоролся. Следует различать пустой список и список null. Три попытки пока не вставил проверку:
if (this.users == null) ...
if (this.users.isEmpty()) ....
При этом я пересоздал объект, если список был пустой и присвоил null в первом случае.
Павел Минеев31 уровень, Челябинск
1 сентября, 20:07
Задача потная, но простая. Хоть какое-то затруднение может вызвать сохранение/загрузка даты и страны. С датой уже несколько раз сталкивались в задачах, поэтому всё просто. Сохранение:
users.get(i).getBirthDate().getTime()
Загрузка:
Date date = new Date(Long.parseLong(usersFields[2]));
где usersField[2] как раз таки хранит сохранённое число миллисекунд в формате long. Со страной чуть сложнее, поскольку енумы в ходе курса освещены очень поверхностно, пришлось погуглить, но решение в итоге простое. Сохранение:
users.get(i).getCountry().getDisplayName()
Загрузка:
User.Country country = User.Country.valueOf(usersFields[4].toUpperCase());
где valueOf() возвращает константу перечисления, значение которой соответствует строке, переданной в параметре, а usersFields[4] содержит сохранённую строку. Не забываем переводить в верхний регистр поскольку енумы прописаны капсом, а имя енума нет.
Владимир Созанский20 уровень, Одесса
26 августа, 18:43
Рекомендация ментора убила наповал
Убедись, что дни рождения пользователей корректно записываются и читаются, с точностью до миллисекунд.
Дмитрий Носалев28 уровень, Москва
30 июля, 17:43
Простое сохранение/загрузка Date:
long dateTime = user.getBirthDate().toInstant().toEpochMilli();
String dateTimeString = Long.toString(dateTime);
outputstream.write(dateTimeString.getBytes())
метод toInstant.toEpochMilli() класса Date возвращает количество миллисекунд прошедших с полуночи 1 января 1970 года. Сохраняем эти миллисекунды в виде строки в файл. Затем при чтении, парсим их и передаем в конструктор, и получаем новый точно такой же Date, что мы сохраняли.
Date date = new Date( Long.parseLong( reader.readLine() ); //Пользовался BufferedReader, читал строку целиком
Быстро, просто и комфортно.
Василий23 уровень, Санкт-Петербург
2 августа, 15:26
А что если пользователь родился до 1970 года? Кстати можно проще - user.getBirthDate().getTime() тоже возвращает число миллисекунд.
Дмитрий Носалев28 уровень, Москва
2 августа, 15:34
Если родился до 1970, то число будет отрицательным. Да, метод getTime() действительно проще!
Павел24 уровень, Санкт-Петербург
6 августа, 09:16
вообще ни слова не понял, пора завязывать с джава и идти на зачистку металла, 35 штук в месяц в полне устроит))
Антон22 уровень, Санкт-Петербург
26 августа, 12:46
Надеюсь ты тролль, иначе ты уже одолел своим пристрастием к рабочим профессиям.
Ivan30 уровень, Нижний Новгород
23 июля, 17:08
Может кто подсказать смысл хранения даты в миллисекундах? Я хранил в формате "ddMMyyyy" и прекрасно себя чувствовал, equals было true. Парсится в обоих случаях, тут дата, там лонг, плюс в файле дата занимает меньше места чем миллисекунды. Это просто хотелка валидатора или есть какая то практическая ценность?
Дмитрий Носалев28 уровень, Москва
30 июля, 17:48
Date это и есть количество миллисекунд, прошедших с полуночи 1 января 1970 года. В вашем случае теряется информация о времени в течении дня и приходиться делать двойное преобразование с применением паттернов.
Ivan30 уровень, Нижний Новгород
31 июля, 12:48
Ну время в течении дня, именно для дня рождения, не должно играть роли) А про двойное преобразование да, не подумал, спасибо.
Мишаня22 уровень
22 июля, 14:37
Для отладки через файл укажите путь в
OutputStream outputStream = new FileOutputStream("C:\\work\\1.txt");
InputStream inputStream = new FileInputStream("C:\\work\\1.txt");
не забываем, если нет значения будет null, а в файле налл - это текст а не значения) Самые проблемные поля в сохранении и загрузки на мой взгляд показались Дата и Страна, придумал простые решения к ним: сохраняем Long dataLong= users.get(i).getBirthDate().getTime(); загружаем user.setBirthDate(new Date(Long.parseLong(temp))); _______ сохраняем User.Country country= users.get(i).getCountry(); загружаем temp = reader.readLine(); if(temp.equals("UKRAINE"))user.setCountry(User.Country.UKRAINE); if(temp.equals("RUSSIA"))user.setCountry(User.Country.RUSSIA); if(temp.equals("OTHER"))user.setCountry(User.Country.OTHER); ________
Alexander23 уровень, Екатеринбург
19 августа, 06:21
По поводу сохранения страны: а что делать, если значений в enum не 3, а, например, 1000? Как автоматизировать поиск совпадений? Тоже считаю это поле одним из самых проблемных. Но пока решение вижу только Вашим способом.
Alexander23 уровень, Екатеринбург
19 августа, 06:58
Сам спросил - сам ответил))) Для получения всех элементов ENUM нужно использовать метод values(). А дальше уже сравнение в цикле for each.
Влад Лохматов20 уровень
суббота, 17:12
Спасибо, тоже было интересно насчёт всех элементов enum, т.к. решил так же
Екатерина20 уровень
позавчера, 12:27
Можно решить через User.Country.valueOf(......), не перебирая все возможные значения. Но при этом сохранение в файл я делала через element.getCountry().
Alanser26 уровень, Кокшетау
8 июля, 16:24
Не создавайте конструктор в User! Заполнять поля надо сетами. 3 попытки на это угрохал.