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

  • 11
  • Недоступна
А теперь пороемся в файлах студентов… И реализуем логику записи в файл/чтения из файла для класса JavaRush с данными учеников. Метод main реализован только для вас и не участвует в тестировании.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (244)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Kroak23 уровень, Москва
30 сентября, 22:18
Ух и жестко всё идёт на этом уровне 3 задачи часов 8 чистого времени на решение:( Хотя задачи, по сути, простые.
Andrey20 уровень, Минск
29 октября, 20:47
Это ещё что, я два дня пытался решить. Подразумевается, что о User известны все 5 полей и не рассматривается возможность того что какие-то данные не известны.
виктор23 уровень, Москва
15 сентября, 11:02
Кто, как и я, ничего не понял в переопределении equals и hashCod (и откуда там появляется число 31) - бежим сюда: Тыц! Тыц!
Тимур23 уровень, Москва
12 сентября, 18:37
Увидел в комментах внизу и возник вопрос - Кто нибудь пробовал решить методами ObjectInputStream/ObjectOutputStream, интересно валидатор примет их? Пример использования класса ObjectOutputStream http://java-online.ru/java-outputstream.xhtml Пример использования класса ObjectInputStream http://java-online.ru/java-inputstream.xhtml
Тимур23 уровень, Москва
12 сентября, 17:48
Кто подскажет, чем эффективнее записывать данные PrintWritter или OutputStream???? Вроде как PrintWritter создает дополнительную сущность... 😕 Кто в курсе, что лучше брать на вооружение? 🤕
Константин Петров25 уровень, Москва
10 сентября, 08:20
Война с валидатором продолжается. На что я напоролся. Следует различать пустой список и список null. Три попытки пока не вставил проверку:
if (this.users == null) ...
if (this.users.isEmpty()) ....
При этом я пересоздал объект, если список был пустой и присвоил null в первом случае.
Павел Минеев41 уровень, Челябинск
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] содержит сохранённую строку. Не забываем переводить в верхний регистр поскольку енумы прописаны капсом, а имя енума нет.
Сергей27 уровень, Киев
24 сентября, 06:02
Сделал так. Валидатор принял Сохранение страны:
bufferedWriter.write(user.getCountry().toString());
Загрузка:
user.setCountry(User.Country.valueOf(bufferedReader.readLine()));
Павел Минеев41 уровень, Челябинск
24 сентября, 07:16
Где-то на 4-5 уровне многопоточности будут подробнее разбираться енамы с интересными задачами. После этого такие вопросы уже кажутся тривиальными. Немного досадно от того, что нужный материал подают с таким опозданием =\
Евгений Буш24 уровень, Санкт-Петербург
29 октября, 06:37
printWriter.println(user.getCountry().name()); - валик пропустил
Владимир Созанский22 уровень, Одесса
26 августа, 18:43
Рекомендация ментора убила наповал
Убедись, что дни рождения пользователей корректно записываются и читаются, с точностью до миллисекунд.
Дмитрий Носалев33 уровень, Москва
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() тоже возвращает число миллисекунд.
Дмитрий Носалев33 уровень, Москва
2 августа, 15:34
Если родился до 1970, то число будет отрицательным. Да, метод getTime() действительно проще!
Павел28 уровень, Санкт-Петербург
6 августа, 09:16
вообще ни слова не понял, пора завязывать с джава и идти на зачистку металла, 35 штук в месяц в полне устроит))
Антон22 уровень, Санкт-Петербург
26 августа, 12:46
Надеюсь ты тролль, иначе ты уже одолел своим пристрастием к рабочим профессиям.
Ivan34 уровень, Нижний Новгород
23 июля, 17:08
Может кто подсказать смысл хранения даты в миллисекундах? Я хранил в формате "ddMMyyyy" и прекрасно себя чувствовал, equals было true. Парсится в обоих случаях, тут дата, там лонг, плюс в файле дата занимает меньше места чем миллисекунды. Это просто хотелка валидатора или есть какая то практическая ценность?
Дмитрий Носалев33 уровень, Москва
30 июля, 17:48
Date это и есть количество миллисекунд, прошедших с полуночи 1 января 1970 года. В вашем случае теряется информация о времени в течении дня и приходиться делать двойное преобразование с применением паттернов.
Ivan34 уровень, Нижний Новгород
31 июля, 12:48
Ну время в течении дня, именно для дня рождения, не должно играть роли) А про двойное преобразование да, не подумал, спасибо.
IceBerg41 уровень, Кривой Рог
22 сентября, 23:30
Дело в том, что сам объект даты будет отличатся в таком случае. Вот есть дата
Mon Sep 23 02:23:41 EEST 2019
Если мы её сохраним и выгрузим по твоему шаблону, то получим
Mon Sep 23 00:00:00 EEST 2019
Это разные объекты даты.
Мишаня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.
Влад Лохматов24 уровень
14 сентября, 17:12
Спасибо, тоже было интересно насчёт всех элементов enum, т.к. решил так же
Екатерина20 уровень
16 сентября, 12:27
Можно решить через User.Country.valueOf(......), не перебирая все возможные значения. Но при этом сохранение в файл я делала через element.getCountry().