Буферизованные и небуферизованные потоки в Java

Я просматривал часть документации по Java IO и просто хотел убедиться, что я прав:

Небуферизованные входные потоки: FileInputStream, InputStreamReader, FileReader

Небуферизованные выходные потоки: FileOutputStream, OutputStreamWriter, FileWriter

Буферизованные выходные потоки: PrintStream, PrintWriter

Кроме того, у нас есть потоки BufferedInputStream, BufferedOutputStream, BufferedReader и BufferedWriter для преобразования небуферизованных потоков в буферизованные версии.

Наконец, я заметил, что для потоков символов, а именно: InputStreamReader, FileReader, OutputStreamWriter, FileWriter, внутренний байтовый буфер поддерживаются для байтов, прежде чем они будут отправлены в поток. Этот байт-буфер не находится под нашим контролем. Следовательно, для потоков символов буферизация относится к высокоуровневому буферу символов для хранения символов, входящих и выходящих из программы.

Я все правильно сказал?

P.S. - Я понимаю, что эта проблема буферизации зависит от реализации, но я просто хочу подтвердить, что говорят javadocs.

Ответ 1

Правила большого пальца:

  • Любой InputStream/Reader, который читает напрямую из внешнего источника (FileInputStream, SocketInputStream и т.д.), является "сырым" и считается небуферизованным. (Хотя на самом деле, вероятно, происходит буферизация, зависит от реализации)

  • Любой "сырой" InputStream или Reader может быть буферизирован с помощью BufferedInputStream или BufferedReader.

  • Те же предположения для OuputStreams/Writers.

  • Другие декодеры потоков (т.е. GZIPInputStream, MD5InputStream, YourSpecialObjectWriter), вероятно, выполняют некоторую буферизацию, но не очень опасны для буферизации источника.