Поскольку поток, по определению, на самом деле не имеет начала или конца и, следовательно, не является надежным способом узнать, сколько доступно, вам просто нужно читать из потока кусками фиксированного размера.Похоже, что вам лучше использовать обычный старый .read (), а не readFully ():
DataInputStream dis = new DataInputStream(...);
byte[] buf = new byte[1024];
int lastRead = 0;
do {
lastRead = dis.read(buf);
//do something with 'buf' here
} while (lastRead > 0);