From d861153596bd52f79d5ffb20eff07a5221bafe7a Mon Sep 17 00:00:00 2001 From: kilien Date: Sun, 12 Mar 2017 16:27:28 +0800 Subject: [PATCH] week03 --- .../coderising/download/DownloadThread.java | 42 +++++++ .../coderising/download/FileDownloader.java | 111 ++++++++++++++++++ .../download/FileDownloaderTest.java | 59 ++++++++++ .../coderising/download/api/Connection.java | 26 ++++ .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 10 ++ .../download/api/DownloadListener.java | 5 + .../download/impl/ConnectionImpl.java | 51 ++++++++ .../download/impl/ConnectionManagerImpl.java | 35 ++++++ 9 files changed, 344 insertions(+) create mode 100644 group09/790466157/src/com/coderising/download/DownloadThread.java create mode 100644 group09/790466157/src/com/coderising/download/FileDownloader.java create mode 100644 group09/790466157/src/com/coderising/download/FileDownloaderTest.java create mode 100644 group09/790466157/src/com/coderising/download/api/Connection.java create mode 100644 group09/790466157/src/com/coderising/download/api/ConnectionException.java create mode 100644 group09/790466157/src/com/coderising/download/api/ConnectionManager.java create mode 100644 group09/790466157/src/com/coderising/download/api/DownloadListener.java create mode 100644 group09/790466157/src/com/coderising/download/impl/ConnectionImpl.java create mode 100644 group09/790466157/src/com/coderising/download/impl/ConnectionManagerImpl.java diff --git a/group09/790466157/src/com/coderising/download/DownloadThread.java b/group09/790466157/src/com/coderising/download/DownloadThread.java new file mode 100644 index 0000000000..a1f93a1134 --- /dev/null +++ b/group09/790466157/src/com/coderising/download/DownloadThread.java @@ -0,0 +1,42 @@ +package com.coderising.download; + + +import java.io.RandomAccessFile; +import java.util.concurrent.CyclicBarrier; + + +//import org.omg.CORBA.portable.InputStream; + +import com.coderising.download.api.Connection; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + CyclicBarrier barrier ; + String filePath; + + public DownloadThread(CyclicBarrier barrier , Connection conn, int startPos, int endPos , String filePath){ + + this.barrier = barrier; + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + this.filePath = filePath; + } + public void run(){ + try{ + System.out.println("begin download startPos="+startPos+",endPos="+endPos); + byte[] buffer = conn.read(startPos , endPos); + RandomAccessFile file = new RandomAccessFile(filePath, "rw"); + file.seek(startPos); + file.write(buffer, 0, buffer.length); + file.close(); + barrier.await(); + }catch(Exception e){ + System.out.println("download error:startPos="+startPos+",endPos="+endPos); + } + } + +} diff --git a/group09/790466157/src/com/coderising/download/FileDownloader.java b/group09/790466157/src/com/coderising/download/FileDownloader.java new file mode 100644 index 0000000000..107e4cc433 --- /dev/null +++ b/group09/790466157/src/com/coderising/download/FileDownloader.java @@ -0,0 +1,111 @@ +package com.coderising.download; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.concurrent.CyclicBarrier; + +import com.coderising.download.api.Connection; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; + + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + private static final int THREAD_NUM = 3; + + private static final String BASE_PATH = "C:/Users/Liner/Desktop/Document/Doc"; + + boolean isFinished = false; + + public FileDownloader(String _url) { + this.url = _url; + File baseFile = new File(BASE_PATH); + if(!baseFile.exists()){ + baseFile.mkdirs(); + } + } + + public void execute(){ + + CyclicBarrier barrier = new CyclicBarrier(THREAD_NUM, new Runnable() { + + @Override + public void run() { + listener.notifyFinished(); + } + }); + + Connection conn = null; + try { + + conn = cm.open(this.url); + + int length = conn.getContentLength(); + String filePath = BASE_PATH + "download."+getFileType(this.url); + //System.out.println(filePath); + + File file = new File(filePath); + if(!file.exists()){ + try { + file.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + try{ + FileOutputStream fos = new FileOutputStream(file); + fos.write(new byte[length], 0, length);//占位 + fos.close(); + } + catch (IOException e) { + System.out.println(e.getMessage()); + } + + int blockSize = (length % THREAD_NUM == 0 ) ? length / THREAD_NUM : (length / THREAD_NUM + 1); + for (int i = 0; i < THREAD_NUM; i++) { + int startPos = i * blockSize; + int endPos = startPos + blockSize - 1; + if(endPos >= length - 1){ + endPos = length - 1; + } + new DownloadThread(barrier , conn, startPos, endPos , filePath).start(); + } + + } catch (ConnectionException e) { + System.out.println(e.getMessage()); + } finally{ + if(conn != null){ + conn.close(); + } + } + + } + + private String getFileType(String url) { + int index = url.lastIndexOf("."); + return url.substring(index + 1 , url.length()); + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + +} \ No newline at end of file diff --git a/group09/790466157/src/com/coderising/download/FileDownloaderTest.java b/group09/790466157/src/com/coderising/download/FileDownloaderTest.java new file mode 100644 index 0000000000..a79d23d9c5 --- /dev/null +++ b/group09/790466157/src/com/coderising/download/FileDownloaderTest.java @@ -0,0 +1,59 @@ +package com.coderising.download; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.coderising.download.api.ConnectionManager; +import com.coderising.download.api.DownloadListener; +import com.coderising.download.impl.ConnectionManagerImpl; + +public class FileDownloaderTest { + boolean downloadFinished = false; + @Before + public void setUp() throws Exception { + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testDownload() { + + String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1488796402240&di=8ca9322617d5338cad61232a06f6ed7a&imgtype=0&src=http%3A%2F%2Fjiangsu.china.com.cn%2Fuploadfile%2F2017%2F0212%2F1486868426284307.jpg"; + + FileDownloader downloader = new FileDownloader(url); + + + ConnectionManager cm = new ConnectionManagerImpl(); + downloader.setConnectionManager(cm); + + downloader.setListener(new DownloadListener() { + @Override + public void notifyFinished() { + downloadFinished = true; + } + + }); + + + downloader.execute(); + + // �ȴ����߳����س���ִ����� + while (!downloadFinished) { + try { + System.out.println("��û��������ɣ���������"); + //����5�� + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("������ɣ�"); + + + + } + +} \ No newline at end of file diff --git a/group09/790466157/src/com/coderising/download/api/Connection.java b/group09/790466157/src/com/coderising/download/api/Connection.java new file mode 100644 index 0000000000..fe772d969c --- /dev/null +++ b/group09/790466157/src/com/coderising/download/api/Connection.java @@ -0,0 +1,26 @@ +package com.coderising.download.api; + +import java.io.IOException; + +public interface Connection { + /** + * ʼͽλã ȡݣ ֵֽ + * @param startPos ʼλã 0ʼ + * @param endPos λ + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + /** + * õݵij + * @return + */ + public int getContentLength(); + + /** + * ر + */ + public void close(); + public Connection open(Object url); +} + + diff --git a/group09/790466157/src/com/coderising/download/api/ConnectionException.java b/group09/790466157/src/com/coderising/download/api/ConnectionException.java new file mode 100644 index 0000000000..132bf8fbdd --- /dev/null +++ b/group09/790466157/src/com/coderising/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public class ConnectionException extends Exception { + +} \ No newline at end of file diff --git a/group09/790466157/src/com/coderising/download/api/ConnectionManager.java b/group09/790466157/src/com/coderising/download/api/ConnectionManager.java new file mode 100644 index 0000000000..e6a9811662 --- /dev/null +++ b/group09/790466157/src/com/coderising/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.coderising.download.api; + +public interface ConnectionManager { + /** + * һurl , һ + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} \ No newline at end of file diff --git a/group09/790466157/src/com/coderising/download/api/DownloadListener.java b/group09/790466157/src/com/coderising/download/api/DownloadListener.java new file mode 100644 index 0000000000..64ac13231b --- /dev/null +++ b/group09/790466157/src/com/coderising/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.coderising.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} \ No newline at end of file diff --git a/group09/790466157/src/com/coderising/download/impl/ConnectionImpl.java b/group09/790466157/src/com/coderising/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..a0bea92f06 --- /dev/null +++ b/group09/790466157/src/com/coderising/download/impl/ConnectionImpl.java @@ -0,0 +1,51 @@ +package com.coderising.download.impl; + + +import java.io.IOException; + + + +import org.omg.CORBA.portable.InputStream; + +import com.coderising.download.api.Connection; + + +import java.net.URLConnection; + +import com.coderising.download.api.Connection; + +public class ConnectionImpl implements Connection{ + +private URLConnection connection; + + @Override + public byte[] read(int startPos, int endPos) throws IOException { +// connection.setAllowUserInteraction(true); +// connection.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); + InputStream inputstream = (InputStream) connection.getInputStream(); + byte[] buffer = new byte[endPos - startPos + 1]; + inputstream.skip(startPos); + inputstream.read(buffer); + inputstream.close(); + return buffer; + } + + @Override + public int getContentLength(){ + return connection.getContentLength(); + } + + @Override + public void close() { + } + + public void setConnection(URLConnection connection) { + this.connection = connection; + } + + @Override + public Connection open(Object url) { + // TODO Auto-generated method stub + return null; + } +} \ No newline at end of file diff --git a/group09/790466157/src/com/coderising/download/impl/ConnectionManagerImpl.java b/group09/790466157/src/com/coderising/download/impl/ConnectionManagerImpl.java new file mode 100644 index 0000000000..99bdec847f --- /dev/null +++ b/group09/790466157/src/com/coderising/download/impl/ConnectionManagerImpl.java @@ -0,0 +1,35 @@ +package com.coderising.download.impl; + + + + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.URL; + + + + +import com.coderising.download.api.Connection; +import com.coderising.download.impl.ConnectionImpl; +import com.coderising.download.api.ConnectionException; +import com.coderising.download.api.ConnectionManager; + +public class ConnectionManagerImpl implements ConnectionManager { + + @Override + public Connection open(String url) throws ConnectionException { + URL urlObj ; + ConnectionImpl connection = null; + try { + urlObj = new URL(url); + connection = new ConnectionImpl(); + } catch (MalformedURLException e) { + throw new ConnectionException(); + } + return connection; + } +} \ No newline at end of file