InputStream filereader = new FileInputStream("C:\\Users\\olegb\\IdeaProjects\\lol\\out\\production\\lol\\com\\company\\"+filename);
while (filereader.available() > 0) {
System.out.print((char)filereader.read());
}
Подскажите пожалуйста, почему выводится весь текст из файла, а не только первый байт до бесконечности.
Мы же не удаляем первый байт(т.е. не даем ридеру идти дальше) и условие доступность всегда истина то есть бесконечный цикл?Oleg Zaytsev
24 уровень
Почему программа работает
Решен
Комментарии (23)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
RiccioMaster
18 марта 2019, 20:45решение
Метод read() класса InputStream считывает все символы строки побайтно, включая символ перевода строки ('10').
Метод readLine() класса BufferedReader считывает всю строку целиком, обрезая ее по краям.
То есть вы считываете все данные, не только первый символ, но побайтно.
+2
Oleg Zaytsev
19 марта 2019, 10:23
Ясно
0
IceBergMaster
18 марта 2019, 19:09
Потому, что метод read() работает не так , как ты думаешь. Встречный вопрос, почему readLine() не читает постоянно первую строчку?
+1
Oleg Zaytsev
19 марта 2019, 10:16
ридлайн читает первую строку, которую мы вводим
0
hidden #598481
19 марта 2019, 10:19
А второй раз - вторую, а не ту же самую, что и в прошлый раз. А ведь System.in - это такой же InputStream, как и тот, что создаешь ты.
0
Oleg Zaytsev
19 марта 2019, 10:22
одна команда ридлайн - читает одну строку
0
hidden #598481
19 марта 2019, 10:22
одна команда read читает один байт!
+1
Oleg Zaytsev
19 марта 2019, 10:24
ясно, спасибо
0
IceBergMaster
19 марта 2019, 10:28
Oleg Zaytsev, если в файле три строки, ридлайн будет читать всегда только первую?
0
Oleg Zaytsev
19 марта 2019, 10:45
как можно ввести 3 строки вместо одной в readline?
0
IceBergMaster
19 марта 2019, 10:47
в смысле "ввести"? Мы же о чтении из файла говорим.
0
Oleg Zaytsev
19 марта 2019, 10:48
не, я еще только байты считываю из файла, первое задание хд
с помощью ридлайна можно строки читать из файла? прикольно
0
IceBergMaster
19 марта 2019, 11:01решение
Можно, и чаще всего нужно.
Ридеры это объекты, которые следуют за потоком, если использовать метод read(), то ридер вернет байт, а сам шагнет на одну позицию вперед, при этом количество оставшихся доступных байт уменьшиться на единицу, а следующий вызов read() будет возвращать уже следующий байт.
+2
--------Master
19 марта 2019, 12:06
Элементарно: запусти любую программу, считывающую несколько строк (например, пока не будет введено exit), создай в блокноте файл, содержащий эти строки, последней строкой exit. Скопируй в буфер все содержимое файла, вставь в консоль одним блоком - понаблюдай, как отработает программа.
+2
Oleg Zaytsev
19 марта 2019, 12:49
как работает while (filereader.available() > 0) ?
Допустим цикл while (5>0) будет бесконечно долгим и программа не завершится
В итераторе используется метод для определения есть ли следующий элемент while(filereader.hasNext()) do,
а тут просто условие
0
IceBergMaster
19 марта 2019, 12:54
Ну допустим у тебя в файле есть 5 байт, while (5>0) - прочитали read() один байт, уже осталось 4, while (4>0), и так пока в 0 не уйдешь.
0
--------Master
18 марта 2019, 19:03
А где ты видел, чтобы чтение из файла означало удаление данных из этого файла?
+1
Oleg Zaytsev
19 марта 2019, 10:14
у нас же нету никаких индексов, значит нужно удалять первый элемент чтобы он постоянно читал новый
0
Oleg Zaytsev
19 марта 2019, 10:54
+ стоит бесконечное условие, если не удалять элементы.
В массивах просто через удаление работал хд
0
--------Master
19 марта 2019, 12:10
В массивах точно так же можно получать первый элемент, за ним - второй, затем третий и т.д. При этом удалять из массива совершенно ничего не нужно. А уж файлы правильнее тогда сравнивать со строками типа "Line1\nLine2\nLine3": если ты проверишь 3-й символ этой строки, это совершенно не означает, что строка превратится в "e1\nLine2\nLine3"
0
Oleg Zaytsev
19 марта 2019, 12:52
ну раньше чтение было чисто по элементам, а тут просто read() + условие вообще не понятное, поток filereader будет же всегда > 0, каким образом образом оно работает, если даже внутри цикла мы ничего не указываем лул
0
--------Master
19 марта 2019, 12:56решение
Как я помню, в потоке используется специальный маркер, при создании потока этот маркер помещается в начало файла или другого источника данных (нулевой байт). Метод available показывает, сколько байт находится после этого маркера. При считывании 1 байта маркер смещается "вправо", количество доступных байт уменьшается на 1 и т.д.
+2
Oleg Zaytsev
19 марта 2019, 17:35
Ясно, спасибо
0