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