Предполагая, что String имеет кратное восьми бит (вы можете добавить его в противном случае), воспользуйтесь встроенным синтаксическим анализом Java в методе Integer.valueOf, чтобы сделать что-то вроде этого:
String s = "11001010001010101110101001001110";
byte[] data = new byte[s.length() / 8];
for (int i = 0; i < data.length; i++) {
data[i] = (byte) Integer.parseInt(s.substring(i * 8, (i + 1) * 8), 2);
}
Тогда вы сможете записать байты в FileOutputStream
довольно просто.
С другой стороны, если вы ищете эффективность, вам следует подумать не об использовании строки для хранения битов, а о создании байтов непосредственно в вашем компрессоре.