ДЛЯ ВВОДА-ВЫВОДА: Он читает информацию большими кусками и хранит эти куски в памяти.
Служит для ускорения доступа, если на самом-самом высоком уровне файл надо читать по одному байту или символу, а на самом-самом низком (например, жёсткий диск) эффективнее это делать блоками по 4K.
У читателей flush (если таковой есть; у BufferedReader, например, его нет) служит для потоков реального времени: клавиатуры, коммуникационных портов и прочего. Всё, что накопилось в буфере, сбрасывается, и считается, что на момент T поток пуст.
Писатели, естественно, пишут данные не сразу, а когда буфер заполнится, и авария программы или перебой электричества эти данные похѣритъ. Для них команда flush физически записывает накопленные данные.
ДЛЯ КАРТИНОК: Картинка хранится не в «аппаратно-эффективном» виде, а в таком, чтобы пользователь мог её относительно просто менять.