Добрый день!
В Java IO действительно существует различие между потоками, которые имеют внутренний буфер, и теми, у которых его нет. Рассмотрим это подробнее.
### Буферизация в потоках
1. **Потоки с внутренним буфером**:
- **OutputStream** и **Writer**, а также их подклассы: многие из них реализуют буферизацию для оптимизации записи данных. Примеры:
- `BufferedOutputStream`
- `BufferedWriter`
- Эти классы могут использовать внутренний буфер для группирования записей перед их фактической отправкой в целевой поток.
2. **Потоки без внутреннего буфера**:
- **InputStream** и **Reader** не имеют встроенной буферизации по умолчанию, но это зависит от конкретных подклассов:
- Например, `FileReader` может не иметь собственного буфера, в то время как `BufferedReader` использует буфер для чтения данных.
- Однако некоторые потоки, такие как `PipedInputStream`, могут использовать буфер, хотя и не реализуют интерфейс **Flushable**.
### Интерфейс Flushable
Интерфейс **Flushable** предназначен для того, чтобы обеспечить возможность сброса данных из буфера в целевое устройство. Это в основном актуально для потоков вывода, которые могут иметь буфер.
### Как определить наличие буфера?
- **Документация**: Наиболее надежным способом является изучение официальной документации Java для каждого конкретного класса. В ней обычно указывается, реализует ли класс буферизацию.
- **Общие категории**:
- **Классы, которые обязательно имеют буфер**: `BufferedOutputStream`, `BufferedWriter`, `BufferedReader`, `BufferedInputStream`.
- **Классы, которые не имеют буфер**: такие как `FileOutputStream`, `FileInputStream`, `Writer` и `OutputStream` в базовом виде.
### Заключение
Вы правы, что наличие интерфейса **Flushable** не всегда является надежным индикатором наличия внутреннего буфера. Чтобы однозначно понимать, какие потоки имеют внутренний буфер, необходимо изучать документацию к каждому конкретному классу или полагаться на общепринятые рекомендации о классах, которые уже были исследованы и протестированы.