Spec-Zone .ru
спецификации, руководства, описания, API
|
Большинство примеров мы до сих пор видели использование небуферизованный ввод-вывод. Это означает каждое чтение, или запрос записи обрабатывается непосредственно базовым ОС. Это может сделать программу намного менее эффективной, так как каждый такой запрос часто инициировал доступ к диску, сетевое действие, или некоторую другую работу, которая относительно дорога.
Чтобы уменьшить этот вид издержек, платформа Java реализует буферизованные потоки ввода-вывода. Буферизованные входные потоковые данные чтения от области памяти, известной как буфер; собственный входной API вызывают только, когда буфер пуст. Точно так же буферизованные потоки вывода пишут данные в буфер, и собственный выходной API вызывают только, когда буфер полон.
Программа может преобразовать небуферизованный поток в буферизованный поток, используя переносящуюся идиому, которую мы использовали несколько раз теперь, где небуферизованный потоковый объект передают конструктору для буферизованного потока class. Вот то, как Вы могли бы изменить вызовы конструктора в CopyCharacters
пример, чтобы использовать буферизованный ввод-вывод:
inputStream = new BufferedReader(new FileReader("xanadu.txt")); outputStream = new BufferedWriter(new FileWriter("characteroutput.txt"));
Есть четыре буферизованных потоковых класса, используемые, чтобы обернуть небуферизованные потоки: BufferedInputStream
и BufferedOutputStream
BufferedReader
BufferedWriter
Часто имеет смысл выписывать буфер в критических точках, не ожидая этого, чтобы заполниться. Это известно как сбрасывание буфера.
Некоторые буферизованные выходные классы поддерживают автосброс, определенный дополнительным параметром конструктора. Когда автосброс включается, определенные ключевые события заставляют буфер быть сброшенным. Например, автосброс PrintWriter
возразите сбрасывает буфер на каждом вызове println
или format
. См. Форматирование для больше на этих методах.
Чтобы сбросить поток вручную, вызовите flush
метод. flush
метод допустим на любом потоке вывода, но не имеет никакого эффекта, если поток не буферизуется.