From 9c0f02067559c9d9938a0a860d267cec66c20f26 Mon Sep 17 00:00:00 2001 From: northSmall <604322962@qq.com> Date: Wed, 15 Mar 2017 23:47:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=A4=9A=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- group19/604322962/learning2017/pom.xml | 33 ++++++ .../main/java/com/coding/basic/ArrayList.java | 2 +- .../java/com/coding/basic/BinaryTreeNode.java | 2 +- .../main/java/com/coding/basic/Iterator.java | 2 +- .../java/com/coding/basic/LinkedList.java | 2 +- .../src/main/java/com/coding/basic/List.java | 2 +- .../src/main/java/com/coding/basic/Queue.java | 2 +- .../src/main/java/com/coding/basic/Stack.java | 2 +- .../com/coding/download/DownloadThread.java | 56 +++++++++ .../com/coding/download/FileDownloader.java | 110 ++++++++++++++++++ .../coding/download/FileDownloaderTest.java | 61 ++++++++++ .../com/coding/download/api/Connection.java | 23 ++++ .../download/api/ConnectionException.java | 5 + .../download/api/ConnectionManager.java | 10 ++ .../coding/download/api/DownloadListener.java | 5 + .../coding/download/impl/ConnectionImpl.java | 61 ++++++++++ .../download/impl/ConnectionManagerImpl.java | 26 +++++ 17 files changed, 397 insertions(+), 7 deletions(-) create mode 100644 group19/604322962/learning2017/pom.xml create mode 100644 group19/604322962/learning2017/src/main/java/com/coding/download/DownloadThread.java create mode 100644 group19/604322962/learning2017/src/main/java/com/coding/download/FileDownloader.java create mode 100644 group19/604322962/learning2017/src/main/java/com/coding/download/FileDownloaderTest.java create mode 100644 group19/604322962/learning2017/src/main/java/com/coding/download/api/Connection.java create mode 100644 group19/604322962/learning2017/src/main/java/com/coding/download/api/ConnectionException.java create mode 100644 group19/604322962/learning2017/src/main/java/com/coding/download/api/ConnectionManager.java create mode 100644 group19/604322962/learning2017/src/main/java/com/coding/download/api/DownloadListener.java create mode 100644 group19/604322962/learning2017/src/main/java/com/coding/download/impl/ConnectionImpl.java create mode 100644 group19/604322962/learning2017/src/main/java/com/coding/download/impl/ConnectionManagerImpl.java diff --git a/group19/604322962/learning2017/pom.xml b/group19/604322962/learning2017/pom.xml new file mode 100644 index 0000000000..92292887f8 --- /dev/null +++ b/group19/604322962/learning2017/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + com.north + learning2017 + 1.0-SNAPSHOT + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.6 + 1.6 + + + + + + + + + dom4j + dom4j + 1.6.1 + + + + + \ No newline at end of file diff --git a/group19/604322962/learning2017/src/main/java/com/coding/basic/ArrayList.java b/group19/604322962/learning2017/src/main/java/com/coding/basic/ArrayList.java index 3f2fa618c5..85c1826bf6 100644 --- a/group19/604322962/learning2017/src/main/java/com/coding/basic/ArrayList.java +++ b/group19/604322962/learning2017/src/main/java/com/coding/basic/ArrayList.java @@ -1,4 +1,4 @@ -package main.java.com.coding.basic; +package com.coding.basic; import java.util.Arrays; diff --git a/group19/604322962/learning2017/src/main/java/com/coding/basic/BinaryTreeNode.java b/group19/604322962/learning2017/src/main/java/com/coding/basic/BinaryTreeNode.java index 2701270b5d..d7ac820192 100644 --- a/group19/604322962/learning2017/src/main/java/com/coding/basic/BinaryTreeNode.java +++ b/group19/604322962/learning2017/src/main/java/com/coding/basic/BinaryTreeNode.java @@ -1,4 +1,4 @@ -package main.java.com.coding.basic; +package com.coding.basic; public class BinaryTreeNode { diff --git a/group19/604322962/learning2017/src/main/java/com/coding/basic/Iterator.java b/group19/604322962/learning2017/src/main/java/com/coding/basic/Iterator.java index 86643482fb..06ef6311b2 100644 --- a/group19/604322962/learning2017/src/main/java/com/coding/basic/Iterator.java +++ b/group19/604322962/learning2017/src/main/java/com/coding/basic/Iterator.java @@ -1,4 +1,4 @@ -package main.java.com.coding.basic; +package com.coding.basic; public interface Iterator { public boolean hasNext(); diff --git a/group19/604322962/learning2017/src/main/java/com/coding/basic/LinkedList.java b/group19/604322962/learning2017/src/main/java/com/coding/basic/LinkedList.java index 1d8b56ede4..a6449c8b68 100644 --- a/group19/604322962/learning2017/src/main/java/com/coding/basic/LinkedList.java +++ b/group19/604322962/learning2017/src/main/java/com/coding/basic/LinkedList.java @@ -1,4 +1,4 @@ -package main.java.com.coding.basic; +package com.coding.basic; import java.util.NoSuchElementException; diff --git a/group19/604322962/learning2017/src/main/java/com/coding/basic/List.java b/group19/604322962/learning2017/src/main/java/com/coding/basic/List.java index ce830df7b8..10d13b5832 100644 --- a/group19/604322962/learning2017/src/main/java/com/coding/basic/List.java +++ b/group19/604322962/learning2017/src/main/java/com/coding/basic/List.java @@ -1,4 +1,4 @@ -package main.java.com.coding.basic; +package com.coding.basic; public interface List { public void add(Object o); diff --git a/group19/604322962/learning2017/src/main/java/com/coding/basic/Queue.java b/group19/604322962/learning2017/src/main/java/com/coding/basic/Queue.java index 744fbb2f10..4a189c64ad 100644 --- a/group19/604322962/learning2017/src/main/java/com/coding/basic/Queue.java +++ b/group19/604322962/learning2017/src/main/java/com/coding/basic/Queue.java @@ -1,4 +1,4 @@ -package main.java.com.coding.basic; +package com.coding.basic; import org.junit.Test; diff --git a/group19/604322962/learning2017/src/main/java/com/coding/basic/Stack.java b/group19/604322962/learning2017/src/main/java/com/coding/basic/Stack.java index 98e9fd701a..67ded99344 100644 --- a/group19/604322962/learning2017/src/main/java/com/coding/basic/Stack.java +++ b/group19/604322962/learning2017/src/main/java/com/coding/basic/Stack.java @@ -1,4 +1,4 @@ -package main.java.com.coding.basic; +package com.coding.basic; import org.junit.Test; diff --git a/group19/604322962/learning2017/src/main/java/com/coding/download/DownloadThread.java b/group19/604322962/learning2017/src/main/java/com/coding/download/DownloadThread.java new file mode 100644 index 0000000000..553fc51398 --- /dev/null +++ b/group19/604322962/learning2017/src/main/java/com/coding/download/DownloadThread.java @@ -0,0 +1,56 @@ +package com.coding.download; + +import com.coding.download.api.Connection; +import com.coding.download.api.ConnectionException; +import com.coding.download.impl.ConnectionManagerImpl; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.concurrent.CountDownLatch; + +public class DownloadThread extends Thread{ + + Connection conn; + int startPos; + int endPos; + String filelocal; + CountDownLatch cdl; + public DownloadThread(Connection conn, int startPos, int endPos, String filelocal, CountDownLatch cdl){ + + this.conn = conn; + this.startPos = startPos; + this.endPos = endPos; + this.filelocal = filelocal; + this.cdl = cdl; + } + public void run(){ + /*try { + RandomAccessFile fos = new RandomAccessFile("C:\\Users\\gaokun\\Desktop\\test3.jpg", "rwd"); + byte[] read = conn.read(startPos, endPos); + fos.seek(startPos); + fos.setLength(endPos-startPos); + fos.write(read); + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + }*/ + RandomAccessFile raf = null; + try { + String url = "http://www.dabaoku.com/sucaidatu/dongwu/chongwujingling/804838.JPG"; + byte[] buf = conn.read(startPos, endPos); + raf = new RandomAccessFile(filelocal, "rwd"); + raf.seek(startPos); + raf.write(buf); + raf.close(); + cdl.countDown(); + } catch (FileNotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } +} diff --git a/group19/604322962/learning2017/src/main/java/com/coding/download/FileDownloader.java b/group19/604322962/learning2017/src/main/java/com/coding/download/FileDownloader.java new file mode 100644 index 0000000000..a78c749f5c --- /dev/null +++ b/group19/604322962/learning2017/src/main/java/com/coding/download/FileDownloader.java @@ -0,0 +1,110 @@ +package com.coding.download; + +import com.coding.download.api.Connection; +import com.coding.download.api.ConnectionException; +import com.coding.download.api.ConnectionManager; +import com.coding.download.api.DownloadListener; + +import java.io.File; +import java.util.concurrent.CountDownLatch; + + +public class FileDownloader { + + String url; + + DownloadListener listener; + + ConnectionManager cm; + + + public FileDownloader(String _url) { + this.url = _url; + + } + + public void execute() throws InterruptedException, ConnectionException { + // 在这里实现你的代码, 注意: 需要用多线程实现下载 + // 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码 + // (1) ConnectionManager , 可以打开一个连接,通过Connection可以读取其中的一段(用startPos, endPos来指定) + // (2) DownloadListener, 由于是多线程下载, 调用这个类的客户端不知道什么时候结束,所以你需要实现当所有 + // 线程都执行完以后, 调用listener的notifiedFinished方法, 这样客户端就能收到通知。 + // 具体的实现思路: + // 1. 需要调用ConnectionManager的open方法打开连接, 然后通过Connection.getContentLength方法获得文件的长度 + // 2. 至少启动3个线程下载, 注意每个线程需要先调用ConnectionManager的open方法 + // 然后调用read方法, read方法中有读取文件的开始位置和结束位置的参数, 返回值是byte[]数组 + // 3. 把byte数组写入到文件中 + // 4. 所有的线程都下载完成以后, 需要调用listener的notifiedFinished方法 + + // 下面的代码是示例代码, 也就是说只有一个线程, 你需要改造成多线程的。 + /*Connection conn = null; + try { + + conn = cm.open(this.url); + + int length = conn.getContentLength(); + + new DownloadThread(conn,0,length-1).start(); + + } catch (ConnectionException e) { + e.printStackTrace(); + }finally{ + if(conn != null){ + conn.close(); + } + }*/ + //Connection conn = null; + /*try { + int threadCount = 3; + Connection conn = cm.open(this.url); + int length = conn.getContentLength(); + int blockSize = length / threadCount; + for (int threadId = 1; threadId <= threadCount; threadId++) { + //第一个线程下载的开始位置 + int startIndex = (threadId - 1) * blockSize; + int endIndex = threadId * blockSize - 1; + if (threadId == threadCount) {//最后一个线程下载的长度要稍微长一点 + endIndex = length; + } + System.out.println("线程:"+threadId+"下载:---"+startIndex+"--->"+endIndex); + new DownloadThread(conn, startIndex, endIndex).start(); + } + } catch (ConnectionException e) { + e.printStackTrace(); + }*/ + + int threadCount = 3; + int startPos; + int endPos; + String filelocaltion = "C:\\Users\\gaokun\\Desktop\\demo.jpg"; + CountDownLatch cdl = new CountDownLatch(3); + for (int i = 0; i < threadCount; i++) { + Connection conn = cm.open(url); + int fileLength = conn.getContentLength(); + startPos = i*fileLength/threadCount; + endPos = (i+1)*fileLength/threadCount-1; + if (i == threadCount-1) + endPos = fileLength-1; + new DownloadThread(conn, startPos, endPos, filelocaltion, cdl).start(); + } + cdl.await(); + System.out.println("线程跑完了!"); + listener.notifyFinished(); + + } + + public void setListener(DownloadListener listener) { + this.listener = listener; + } + + + + public void setConnectionManager(ConnectionManager ucm){ + this.cm = ucm; + } + + public DownloadListener getListener(){ + return this.listener; + } + +} diff --git a/group19/604322962/learning2017/src/main/java/com/coding/download/FileDownloaderTest.java b/group19/604322962/learning2017/src/main/java/com/coding/download/FileDownloaderTest.java new file mode 100644 index 0000000000..10e70736f7 --- /dev/null +++ b/group19/604322962/learning2017/src/main/java/com/coding/download/FileDownloaderTest.java @@ -0,0 +1,61 @@ +package com.coding.download; + +import com.coding.download.api.ConnectionException; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import com.coding.download.api.ConnectionManager; +import com.coding.download.api.DownloadListener; +import com.coding.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() throws ConnectionException, InterruptedException, ConnectionException { + + String url = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1489601005973&di=e104648a3c8dcaabb18dfb5d98870d84&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fbaike%2Fpic%2Fitem%2F3b292df5e0fe992536be579530a85edf8cb17140.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("下载完成!"); + + + + } + + void testRead(){ + + } +} diff --git a/group19/604322962/learning2017/src/main/java/com/coding/download/api/Connection.java b/group19/604322962/learning2017/src/main/java/com/coding/download/api/Connection.java new file mode 100644 index 0000000000..65f3dae9c5 --- /dev/null +++ b/group19/604322962/learning2017/src/main/java/com/coding/download/api/Connection.java @@ -0,0 +1,23 @@ +package com.coding.download.api; + +import java.io.IOException; + +public interface Connection { + /** + * 给定开始和结束位置, 读取数据, 返回值是字节数组 + * @param startPos 开始位置, 从0开始 + * @param endPos 结束位置 + * @return + */ + public byte[] read(int startPos,int endPos) throws IOException; + /** + * 得到数据内容的长度 + * @return + */ + public int getContentLength(); + + /** + * 关闭连接 + */ + public void close(); +} diff --git a/group19/604322962/learning2017/src/main/java/com/coding/download/api/ConnectionException.java b/group19/604322962/learning2017/src/main/java/com/coding/download/api/ConnectionException.java new file mode 100644 index 0000000000..1db8b093ec --- /dev/null +++ b/group19/604322962/learning2017/src/main/java/com/coding/download/api/ConnectionException.java @@ -0,0 +1,5 @@ +package com.coding.download.api; + +public class ConnectionException extends Exception { + +} diff --git a/group19/604322962/learning2017/src/main/java/com/coding/download/api/ConnectionManager.java b/group19/604322962/learning2017/src/main/java/com/coding/download/api/ConnectionManager.java new file mode 100644 index 0000000000..1d1a83caf2 --- /dev/null +++ b/group19/604322962/learning2017/src/main/java/com/coding/download/api/ConnectionManager.java @@ -0,0 +1,10 @@ +package com.coding.download.api; + +public interface ConnectionManager { + /** + * 给定一个url , 打开一个连接 + * @param url + * @return + */ + public Connection open(String url) throws ConnectionException; +} diff --git a/group19/604322962/learning2017/src/main/java/com/coding/download/api/DownloadListener.java b/group19/604322962/learning2017/src/main/java/com/coding/download/api/DownloadListener.java new file mode 100644 index 0000000000..c41045b0e8 --- /dev/null +++ b/group19/604322962/learning2017/src/main/java/com/coding/download/api/DownloadListener.java @@ -0,0 +1,5 @@ +package com.coding.download.api; + +public interface DownloadListener { + public void notifyFinished(); +} diff --git a/group19/604322962/learning2017/src/main/java/com/coding/download/impl/ConnectionImpl.java b/group19/604322962/learning2017/src/main/java/com/coding/download/impl/ConnectionImpl.java new file mode 100644 index 0000000000..85507313ad --- /dev/null +++ b/group19/604322962/learning2017/src/main/java/com/coding/download/impl/ConnectionImpl.java @@ -0,0 +1,61 @@ +package com.coding.download.impl; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; + +import com.coding.download.api.Connection; + +public class ConnectionImpl implements Connection{ + + private URLConnection urlConnection; + + public ConnectionImpl(URLConnection urlConnection) { + this.urlConnection = urlConnection; + } + + @Override + public byte[] read(int startPos, int endPos) throws IOException { + int readBytes = 0; + /*int len = endPos-startPos+1; + byte[] buffer = new byte[1024]; + urlConnection.setRequestProperty("Range", "bytes=" + startPos + "-" + endPos); + InputStream is = urlConnection.getInputStream();//已经设置了请求的位置,返回的是当前位置对应的文件的输入流 + while (readBytes