Вы читаете сокет до тех пор, пока read()
не вернет -1. Это условие конца потока (EOS). EOS происходит, когда партнер завершает соединение. Не когда он заканчивает запись одного файла.
Вам нужно отправить размер файла перед каждым файлом. Вы уже делаете подобное с количеством файлов. Затем убедитесь, что вы прочитали точно столько байтов для этого файла:
String filename = dis.readUTF();
long fileSize = dis.readLong();
FileOutputStream fos = new FileOutputStream(filename);
while (fileSize > 0 && (n = dis.read(buf, 0, (int)Math.min(buf.length, fileSize))) != -1)
{
fos.write(buf,0,n);
fileSize -= n;
}
fos.close();
Вы можете заключить все это в цикл, который завершается, когда readUTF()
выбрасывает EOFException
. Наоборот, вы должны вызывать writeUTF(filename)
и writeLong(filesize)
у отправителя перед отправкой данных.
вставьте в D2 и перетащите вправо:
=ARRAYFORMULA(IFERROR(VLOOKUP($A$2:$A,
QUERY(INPUT!$A$2:$H, "select C,H where A='"&D$1&"'"), 2, 0), ))