Если вы знаете длину, использование readFully () намного эффективнее, чем чтение байта за раз.
В этом случае вам не нужно знать длину, вы можете написать цикл для чтения / записи как можно большего количества данных.
InputStream is = connectionSocket.getInputStream();
byte[] bytes = new byte[8192];
int len;
while((len = is.read(bytes)) > 0)
fos.write(bytes, 0, len);
Вы можете избежать чтения всего файла в память, копируя данные по мере их чтения.
FileInputStream fis = new FileInputStream(filename);
OutputStream os = socket.getOutputStream();
byte[] bytes = new byte[8192];
int len;
while((len = fis.read(bytes)) > 0)
os.write(bytes, 0, len);
Вы можете использовать Apache IOUtils .copy () для выполнения копирования из одного потока в другой, если хотите.
Преимущество этого подхода заключается в том, что файл может иметь любой размер (более 2 ГБ). Использование массива ограничено 2 ГБ (и использует больше памяти)