Все, что говорит @jspcal, получает +1 от меня.Я добавлю, что лучший способ ответить на ваш вопрос - посмотреть на код.Исходный код Java обычно довольно доступен.Вам нужно убедиться, что вы знаете, какая реализация поддерживает ваш объект OutputStream, если это все, что вы знаете заранее.
Самый простой способ сделать это - использовать хороший отладчик.Вы можете точно знать, что смотрите на правильный код, поместив точку останова в точке вызова в соответствующий объект OutputStream, например, f.write () или f.flush (), и затем войдите в вызов,Я ожидаю, что вы могли бы выяснить, когда вызывается f.flush () для любой конкретной реализации OutputStream, которая вас может заинтересовать.
Если вы просто заинтересованы, вы можете посмотреть на JavaDoc дляOutputStream, и он должен дать вам список, по крайней мере, наиболее важных из стандартных классов, которые подклассируют этот абстрактный класс.
... пришлось самому искать этот документ.Вот что я получил:
См. Также: BufferedOutputStream, ByteArrayOutputStream, DataOutputStream, FilterOutputStream, InputStream
с InputStream в списке, я думаю, все они не являются реализациямиOutputStream.Я понимаю, почему они упоминают InputStream, входной аналог OutputStream.
Оказывается, что BufferedOutputStream не делает ничего интересного.По умолчанию используется буфер 8K.Он очищает буфер только A), когда поставляемые данные для записи превышают пространство, оставшееся в буфере, или B) до закрытия потока.Я заметил один интересный момент.Если вы записываете больше размера буфера в одном вызове write (), код сбрасывает буфер, а затем просто напрямую записывает новые данные в базовый поток, вообще не проходя через буфер.Таким образом, если вы напишите что-то большее, чем размер буфера, буфер всегда будет пустым.Имеет смысл.Так что, если все ваши записи больше, чем размер буфера, BufferedOutputStream на самом деле ничего не делает.