Каковы некоторые реальные случаи использования методов пропуска и сброса в BufferedReader? - PullRequest
1 голос
/ 27 июня 2019

Я пытаюсь выяснить, для чего действительно нужны методы mark() и reset() из BufferedReader ?

Я понимаю, что они делают, но для перехода назад и вперед в каком-то тексте я их никогда не использовал - обычно я решаю эту проблему, читая либо последовательность символов, либо всю строку в массиве, либо StringBuilder и иди туда и обратно через него.

Я полагаю, что должна быть какая-то причина, по которой эти методы присутствуют в BufferedReader и других Reader реализациях, поддерживающих его, но я не могу предположить, почему.

Предоставляет ли использование mark() & reset некоторую выгоду по сравнению с чтением данных в нашем собственном массиве и перемещением по нему?

Я искал кодовую базу одного из моих больших проектов, над которыми я работаю (в основном, Java , используя Spring Boot ), с большим количеством зависимостей от пути к классам и единственное, для чего использовались методы mark & ​​reset (только в очень немногих библиотеках), было пропуск необязательного символа спецификации в начале текстового файла. И даже для этого простого варианта использования я нахожу его немного хитрым.

Кроме того, я искал другие учебные пособия и в Stackoverflow (например, Что такое пометка и сброс в BufferedReader? ) и не смог найти никакого объяснения, почему на самом деле нужно решать подобные проблемы, используя пометить и сбросить . Все примеры кода объясняют только то, что методы делают на примерах "hello world" (без особой причины переход с одной позиции в потоке на предыдущую). Нигде я не мог найти никакого объяснения, почему кто-то на самом деле должен использовать его среди других способов, которые звучат более элегантно и на самом деле не хуже производительности.

1 Ответ

3 голосов
/ 28 июня 2019

Я не использовал их сам, но на ум приходит случай, когда вы хотите скопировать данные в структуру, которая должна иметь правильный размер.

При чтении потоков и копировании данных в целевую структуру данных (возможно, после ее анализа) у вас всегда возникает проблема, заключающаяся в том, что вы заранее не знаете, насколько велика цель. Функция пометки / перемотки позволяет пометить, прочитать поток, быстро проанализировать его, чтобы рассчитать размер, сбросить, распределить память, а затем повторно проанализировать, копируя данные на этот раз. Конечно, есть и другие способы сделать это (например, использовать свой собственный динамический буфер), но если ваш код уже сконцентрирован на концепции Reader, то пометка / сброс позволит вам остаться с этим.

Тем не менее, даже собственный метод readLine BufferedReader не использует эту технику (он создает StringBuffer внутри).

...