FileWriter должен использоваться для записи символьных потоков. Если вы пытаетесь записать двоичные данные, тогда подходит FileOutputStream. Если вы замените FileWriter на FileOutputStream, а BufferedWriter на BufferedOutputStream, вы обнаружите, что данные записаны так, как вы ожидаете.
FileWriter поддерживает символы и кодировки, что означает, что он может преобразовывать данные, которые вы передаете через него, в соответствии с кодировкой символов. Но, честно говоря, я не знаю точно, что здесь происходит.