Ваш цикл не верен. Вы должны позаботиться о возвращаемом значении из прочитанного. Он возвращает количество байтов, которые были фактически прочитаны, и это не всегда совпадает с размером буфера.
Edit:
Вот как вы обычно пишете циклы, которые делают то, что вы хотите сделать:
OutputStream z = null; //Shouldn't be null
InputStream in = null; //Shouldn't be null
byte[] buffer = new byte[1024 * 32];
int len = 0;
while ((len = in.read(buffer)) > -1) {
z.write(buffer, 0, len);
}
Обратите внимание, что вы можете использовать буферизованные потоки вместо небуферизованных.