package cn.net.pikachu.download.impl; import cn.net.pikachu.download.LogUtil; import cn.net.pikachu.download.api.Connection; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConnection; import java.net.URL; public class ConnectionImpl implements Connection { private String url; private InputStream is; public ConnectionImpl(String url) { this.url = url; } @Override public byte[] read(int startPos, int endPos) throws IOException { URL u = new URL(url); HttpURLConnection connection = (HttpURLConnection) u.openConnection(); connection.setConnectTimeout(5000); connection.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); InputStream is = connection.getInputStream(); int len = endPos-startPos+1; LogUtil.log(" startPos = "+startPos+", endPos = "+endPos+", len = "+len); byte[] bytes = new byte[is.available()>len?is.available():len]; int totalReceived = 0; LogUtil.log("len = "+len+", available = "+is.available()); int received = 0; try { int left = len - totalReceived; while (left > 0){ LogUtil.log(" available = "+is.available()); LogUtil.log(" left = " + left+", totalReceived = "+totalReceived+", len = "+len); if (left >= 1024){ received = is.read(bytes,totalReceived,1024); }else { received = is.read(bytes,totalReceived,left); } totalReceived+=received; LogUtil.log(" received = "+received+", totalReceived = "+totalReceived); if (is.available() == 0){ LogUtil.log("is.available() == 0"); break; } if (received==0){ LogUtil.log("received == 0"); System.exit(0); } left = len - totalReceived; /* if (left == 0){ LogUtil.log("left = 0; break;"); break; } */ } }catch (Exception e){ e.printStackTrace(); LogUtil.log("Exception received = "+received+", totalReceived = "+totalReceived); System.exit(0); } return bytes; } @Override public int getContentLength() { HttpURLConnection connection = null; try { URL u = new URL(url); connection = (HttpURLConnection) u.openConnection(); connection.setConnectTimeout(5000); connection.setRequestMethod("GET"); return connection.getContentLength(); } catch (IOException e) { e.printStackTrace(); return -1; } } @Override public void close() { if (is!=null){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } }