A Java implementation of a file downloader that fetches chunks of a file in parallel using HTTP range requests and assembles them into a single output file.
The downloader sends a HEAD request to the server to get the file size and confirm range request support. It then splits the file into equal-sized chunks, downloads each chunk in a separate thread using the HTTP Range header, and merges them in order into the output file. If the server does not support range requests it falls back to a single full GET request.