Создает ли Java-сканер неявно буфер, даже если вы его не пропустили? - PullRequest
4 голосов
/ 27 августа 2009

Если у меня есть следующий файл примера, где каждое число представляет байт (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 () НЕ будет печатать первый байт после первого разделителя, найденного сканером, а скорее в конце «порции», которую занял сканер?

Ответы [ 2 ]

4 голосов
/ 27 августа 2009

Да .

Из 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;
1 голос
/ 27 августа 2009

Это не очевидно, но если вы внимательно посмотрите на документацию API Scanner, вы увидите, что он основан на интерфейсе Readable - и единственный метод в этом интерфейсе основан на буфере. Так что да, Сканер неявно создает буфер.

...