package com.dudy.learn01.coderising.download.impl; import com.dudy.learn01.coderising.download.api.Connection; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class ConnectionImpl implements Connection { private HttpURLConnection connection; public ConnectionImpl(String url) { try { this.connection = (HttpURLConnection) new URL(url).openConnection(); } catch (IOException e) { e.printStackTrace(); } } @Override public byte[] read(int startPos, int endPos) throws IOException { connection.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); InputStream in = connection.getInputStream(); byte buffer[] = new byte[endPos-startPos+1]; byte result[] = new byte[endPos-startPos+1]; int count = 0; // 记录已经读取的数据 int length = -1 ; while ((length = in.read(buffer)) > 0){ System.arraycopy(buffer,0,result,count,length); count += length; } return result; } @Override public int getContentLength() { return connection.getContentLength(); } @Override public void close() { if (connection != null){ connection.disconnect(); } } public static void main(String[] args) throws Exception{ //String PATH = "http://demo2.yun.myuclass.com/upload/demo2.yun.myuclass.com/winshare/pagelogo/250617391.png"; String PATH = "http://www.lgstatic.com/www/static/mycenter/modules/common/img/tou_42952f6.png"; URL url = new URL(PATH); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //conn.setConnectTimeout(5000); //conn.setRequestMethod("GET"); //设置头部的参数,表示请求服务器资源的某一部分 //conn.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); //设置了上面的头信息后,响应码为206代表请求资源成功,而不再是200 int code = conn.getResponseCode(); System.out.println(conn.getContentLength()); if(code == 200){ InputStream is = conn.getInputStream(); int hasRead = 0; byte[] buf = new byte[conn.getContentLength()]; System.out.println(buf.length); //这里要注意新创建一个RandomAccessFile对象,而不能重复使用download方法中创建的 RandomAccessFile raf = new RandomAccessFile(new File("/Users/dudy/Desktop/1.png"), "rw"); //将写文件的指针指向下载的起始点 raf.seek(0); while((hasRead = is.read(buf,0,conn.getContentLength())) > 0) { System.out.println("hasRead = " + hasRead); raf.write(buf, 0, hasRead); } is.close(); raf.close(); conn.disconnect(); } } }