Зачем ему выбрасывать OutOfMemoryException
?Это просто запись на диск.Я не удивлюсь, если бы FileOutputStream
и DataOutputStream
имели некоторую буферизацию (я не проверял), но они, конечно, не обязаны буферизовать все , что вы пишете.
Этот код не использует NIO напрямую, хотя я не удивлюсь, если некоторые из внутренних вещей сделали.Что касается того, какие системные вызовы задействованы, и когда - это будет зависеть от реализации, но важно понимать, что ни DataOutputStream
, ни FileOutputStream
не предназначены для буферизации всего.Вы записываете в них некоторые данные, и некоторые из этих данных могут записываться на диск.Если вы сбрасываете или закрываете поток, это должно сделать все записанными вами данными на диск.Если вы не не очистите или не закроете поток, я бы ожидал, что будет кэшировано только достаточно небольшое количество (опять же, зависящее от реализации), если оно есть.
Обратите внимание, что BufferedOutputStream
действительно вводит кэширование - но только столько, сколько вы просите (или по умолчанию).Опять же, он не будет буферизовать все , если вы не запросите столько буфера, сколько пишете в терминах данных.