Я бы использовал что-то вроде следующего:
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
GZipOuputStream gzipOut = new GZipOutputStream(byteOut);
// write your stuff
byte[] bites = byteOut.toByteArray();
//write the bites to the amazon stream
Вы записываете сжатые значения в поток байтов, а затем берете значения байтов, и вы можете записать их в другой поток. Вы также можете перенести поток на сайт amazon (то есть поток вывода из http-соединения или чего-то подобного) и избежать всего ByteArrayOutputStream.
Редактировать: я заметил ваше последнее предложение - bleah. Вы можете взять созданные вами байты, создать с ними ByteArrayInputStream, а затем передать его в качестве входного потока:
ByteArrayInputStream byteInStream = new ByteArrayInputStream(bites);
Он должен читать из входного потока в выходной поток, если я правильно понимаю, что вы описываете правильно. В противном случае вы можете просто записать в выходной поток.