Создает ли Java Scanner неявно буфер, даже если вы ему его не передаете?
-
20-09-2019 - |
Вопрос
Если у меня есть следующий пример файла, где каждое число представляет собой байт (123 содержит байты 1, 2 и 3):
123456789
Допустим, я создаю FileInputStream.Это считывается в двоичном формате байт за байтом.Итак .read() возвращает 1, затем 2 и т.д.Теперь предположим, что я создаю буфер.Начальный фрагмент, который он считывает (если я правильно понимаю буферы), равен 1-5.Это позволяет ему не только считывать байт за байтом, но и в случае символов целые строки и т.д.Но если я снова нажму .read(), я начну с 6, а НЕ с того места, где остановился BufferedReader (поэтому, если 3 - это разрыв строки, и я сказал BufferedReader напечатать первую строку, он напечатает 1-2, а затем с помощью .read() из FileInputStream я получу 6, а не 3.)
Чтобы иметь возможность анализировать данные по разделителю, создает ли сканер неявно буфер, подобный тому, как BufferedReader создает буфер, чтобы он мог находить разрывы строк и т.д.?И если я передам отдельный FileInputStream в сканер, использование .read() НЕ будет печатать первый байт после первого разделителя, найденного сканером, а скорее в конце "фрагмента", взятого сканером?
Решение
ДА.
Из java.util.Scanner
код:
// Internal buffer used to hold input
private CharBuffer buf;
// Size of internal character buffer
private static final int BUFFER_SIZE = 1024; // change to 1024;
Другие советы
Это не очевидно, но если вы внимательно посмотрите на документ API Scanner, вы увидите, что он основан на Readable
интерфейс - и единственный метод в этом интерфейсе основан на буфере.Так что да, Scanner неявно создает буфер.