There are two problems here:
The sheer volume of data.
Handling disconnections without having to resend all the data from scratch.
The volume can be helped by using compression. Core Java has compression libraries built in that will allow you to zip the data before sending and unzip it on arrival.
Disconnections is harder as you need to resume where you left off. There are a number of ways to do that involving either custom protocols or by using existing ones such as bittorrent.
Using bittorrent would also allow you to peer-to-peer the transmission if you have identical data going to massive numbers of users and are not too worried about privacy/security of the data.