InputStream.read
не гарантирует чтение какого-либо определенного количества байтов и может читать меньше, чем вы просили.Он возвращает фактическое прочитанное число, так что вы можете иметь цикл, который отслеживает прогресс:
public void pump(InputStream in, OutputStream out, int size) {
byte[] buffer = new byte[4096]; // Or whatever constant you feel like using
int done = 0;
while (done < size) {
int read = in.read(buffer);
if (read == -1) {
throw new IOException("Something went horribly wrong");
}
out.write(buffer, 0, read);
done += read;
}
// Maybe put cleanup code in here if you like, e.g. in.close, out.flush, out.close
}
Я считаю, что в Apache Commons IO есть классы для такого рода вещей, поэтому вам не нужно писать это самостоятельно.