Когда Java сбрасывает OutputStream? - PullRequest
0 голосов
/ 22 марта 2019

Java OutputStream включает метод flush(), который можно использовать для принудительной записи буферизованного вывода в файл, сокет, устройство и т. Д.

Я только что заметил в своем приложении, что перед тем как сбросить его в файл, он буферизует довольно много данных, и мне стало интересно: как Java решает, когда время для сброса?

Я бы предположил, что он попытается принять какое-то разумное решение, основанное на том, сколько памяти у него есть, и, следовательно, может сбрасываться чаще, когда память ограничена. Но это только обоснованное предположение.

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Все, что говорит @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 на самом деле ничего не делает.

0 голосов
/ 22 марта 2019

OutputStream является абстрактным классом и по умолчанию не реализует поведение сброса.Когда и как сбрасывать данные, зависит от конкретного класса, который реализует функции write.Стратегии промывки могут широко варьироваться.По умолчанию BufferedOutputStream использует размер буфера 8 192 байта.Сброс данных большими кусками сводит к минимуму количество системных вызовов при записи в ресурс операционной системы, но добавляет сложность и задержку, поскольку незаполненные данные могут оставаться в буфере в течение некоторого дополнительного времени.Оптимальная стратегия буферизации будет зависеть от базового устройства или канала, на который выполняется запись.Если вы хотите убедиться, что все ранее записанные данные сброшены в определенный момент, вызовите flush явно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...