public class RangeTask extends Thread {
private final String url;
private final String name;
private long start;
private long end;
private long complete = 0 ;
public RangeTask ( String url, String name, long start, long end) throws FileNotFoundException {
this . url = url;
this . name = name;
this . start = start;
this . end = end;
}
@Override
public void run ( ) {
try {
final OkHttpClient client = new OkHttpClient ( ) ;
final String range = "bytes=%s-%s" ;
final Request request = new Request. Builder ( ) . addHeader ( "RANGE" , String. format ( range, start, end) ) . url ( url) . build ( ) ;
Response response = client. newCall ( request) . execute ( ) ;
InputStream is = Objects. requireNonNull ( response. body ( ) ) . byteStream ( ) ;
RandomAccessFile file = new RandomAccessFile ( name, "rw" ) ;
file. seek ( start) ;
int size = 4096 ;
byte [ ] buffer = new byte [ size] ;
int tmp;
while ( ( tmp = is. read ( buffer) ) != - 1 ) {
file. write ( buffer, 0 , tmp) ;
complete += tmp;
start += tmp;
}
} catch ( IOException e) {
e. printStackTrace ( ) ;
}
}
}
public class DownloadTask extends Thread {
public static void main ( String[ ] args) throws IOException {
new DownloadTask ( "demo.rar" , "http://forspeed.onlinedown.net/down/newdown/5/06/FBXwenjiandakaigongju.rar" , "D:\\" , 5 ) . start ( ) ;
}
private final String name;
private final String url;
private final String path;
private final int size;
public DownloadTask ( String name, String url, String path, int size) {
this . name = name;
this . url = url;
this . path = path;
this . size = size;
}
@Override
public void run ( ) {
OkHttpClient client = new OkHttpClient ( ) ;
Request request = new Request. Builder ( ) . url ( url) . build ( ) ;
try {
Response response = client. newCall ( request) . execute ( ) ;
long length = Objects. requireNonNull ( response. body ( ) ) . contentLength ( ) ;
response. close ( ) ;
String filePath = path + File. separator + name;
long rangeSize = ( long ) Math. ceil ( ( double ) length / size) ;
for ( int i = 0 ; i < size; i++ ) {
System. out. println ( i + 1 + ":" + ( i * rangeSize) + "," + ( ( i + 1 ) * rangeSize - 1 ) ) ;
RangeTask rangeTask = new RangeTask ( url, filePath, i * rangeSize, ( i + 1 ) * rangeSize) ;
rangeTask. setName ( name + "-" + ( i + 1 ) ) ;
rangeTask. start ( ) ;
}
} catch ( IOException e) {
e. printStackTrace ( ) ;
}
}
}