В чем разница b = reader.read() и reader.ready()

Рейтинг: 0Ответов: 1Опубликовано: 29.07.2023

решая задачки на Степике столкнулся с тем что валидатор принял ответ

public static String readAsStringNew(InputStream inputStream, Charset charset) throws IOException {

        StringWriter string = new StringWriter();
        Reader reader = new InputStreamReader(inputStream, charset);
        int b;
        while ((b = reader.read()) != -1) {
            string.write(b);
        }

        return string.toString();
    }

но не принимает


public static String readAsString(InputStream inputStream, Charset charset) throws IOException {

        StringWriter r = new StringWriter();
        Reader reader = new InputStreamReader(inputStream, charset);
        while (reader.ready()){
            r.write(reader.read());
        }
        return r.toString();
    }

Ключевое отличие как я понимаю (b = reader.read()) != -1) и reader.ready()

Ответы

▲ 2Принят

InputStreamReader.ready:

Returns:

True if the next read() is guaranteed not to block for input, false otherwise. Note that returning false does not guarantee that the next read will block.

Метод ready может вернуть false, а последующий read может прочитать ещё данные из потока. Потому что ready - средство для организации неблокирующего чтения, а не проверка того что данные закончились вообще.

То, что данные закончились вообще можно узнать только по неуспеху read.

Валидатор прав. Вариант с ready может совсем ничего не прочитать, или прочитать только те данные, которые были помещены в буфер при открытии ридера. Тестировать на данных, которые заведомо больше буфера. Иначе ошибка может быть не заметна.