По мотивам этой задачи родился вопрос.
Не нашел в документации метод (ни в BufferedReader, ни в Scanner), позволяющий как бы возвращаться назад. Это принципиально невозможно? (типа работа с потоком и все такое), и единственный вариант это все сохранять куда-нибудь, а потом пользоваться. Или все-таки какой-нибудь метод существует.
Aлександр 52
21 уровень
Есть ли метод для возврата назад при считывании с консоли
Решен
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
hidden #598481
22 декабря 2022, 08:10
Непонятно, что ты имеешь в виду под "возвращаться назад", а главное зачем тебе это нужно, чего ты хочешь добиться? Опиши пожалуйста детальнее свои мысли.
+1
Aлександр 52
22 декабря 2022, 10:12
На псевдокоде:
Если (следущая строчка* не пустая) {
делаю со следующей строчкой** что-то;
}
Понятно, что в этом примере * и ** - разные строчки.
Поэтому хотелось бы:
Если (следущая строчка* не пустая) {
верни на строчку назад;
делаю со следующей строчкой** что-то;
}
Во втором случае * и ** - это одна и та же строчка.
Я в документации такого откапать не смог. Понятно, что это обходится инициализацией вспомогательных строчек, и всё же вдруг есть такая опция.
P.S. В этих примерах под строчками имеются ввиду .readLine() или .nextLine() и т.п. "консольное".
0
hidden #598481
22 декабря 2022, 10:34решение
Нет, так нельзя сделать, и это как раз-таки является закономерным поведением.
Если метод тебе что-то возвращает, то ты можешь полученный результат либо сохранить в переменную (или сразу обработать другим образом), или проигнорировать, и тогда объект будет уничтожен сборщиком мусора, потому что на него ничего не ссылается. Если ты хочешь, чтобы объект не исчез, ты должен сохранить ссылку на него в переменную.
Вот тебе другой пример, не связанный с потоками.
Точно так же и тут. Если ты не сохранил ссылку на полученный объект в переменную, этот объект уничтожится сборщиком мусора:И дело не в сканере или ридере. Ты хочешь каким-то образом передвинуть указатель в читаемом потоке назад. Чтобы это было реально, тебе нужно, чтобы кто-то куда-то данные из этого потока сохранил в переменную, логично? Сканер и ридер тебе просто предоставляют доступ к данным этого потока, ты можешь самостоятельно его хоть весь сохранить отдельно в какой-нибудь ByteArrayOutputStream и читать столько раз, сколько тебе требуется. Только вот тебе из него нужно не всё, а только предыдущая строчка. И тут мы вернулись туда, откуда начинали: надо просто сохранить прочитанную строку в переменную и всё. Тем более что никакая она не вспомогательная, она же тебе нужна для дальнейшей работы.
+2
Aлександр 52
22 декабря 2022, 10:53
Всё понял. Спасибо за разъяснения!
Вопрос-то важный. Этот момент так скажем "на чувстве", "на опыте". Для новичка же это чувство в моменте то есть, то вдруг (почему-то) нет.
Хорошо ты все по полочкам разложил.
0