Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ public void run(){
os.write(bytes, startPos, endPos-startPos+1);
cyclicBarrier.await();//等待其他线程
*/
System.out.println("开始读["+startPos+","+endPos+"]");
byte[] buffer = conn.read(startPos , endPos);
RandomAccessFile file = new RandomAccessFile(descFilePath, "rw");
file.seek(startPos);
Expand All @@ -56,7 +57,7 @@ public void run(){
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("所有线程都下载完成");
//System.out.println("所有线程都下载完成");
//通知 FileDownloader ,自己已经做完

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,16 @@ public FileDownloader(String _url) {
this.url = _url;

}

private void createPlaceHolderFile(String fileName, int contentLen) throws IOException{

RandomAccessFile file = new RandomAccessFile(fileName,"rw");

for(int i=0; i<contentLen ;i++){
file.write(0);
}

file.close();
}
public void execute(){
// 在这里实现你的代码, 注意: 需要用多线程实现下载
// 这个类依赖于其他几个接口, 你需要写这几个接口的实现代码
Expand All @@ -54,14 +63,19 @@ public void execute(){
conn = cm.open(this.url);

int length = conn.getContentLength();
File desc=new File(OUT_FILE_NAME);
if(desc.exists()){
desc.delete();
}

String filename=url.substring(url.lastIndexOf("/"));
String descFilePath="E://testfile//"+filename;
createPlaceHolderFile(OUT_FILE_NAME, length);

CyclicBarrier barrier=new CyclicBarrier(THREAD_NUM,new Runnable() {
@Override
public void run() {
listener.notifyFinished();

}
});
/*int every=length/3;
Expand Down Expand Up @@ -91,20 +105,21 @@ public void run() {
// 最后一个线程下载指定numPerThred+left个字节
start=(int) (i * numPerThred);
end=(int) ((i + 1) * numPerThred
+ left);
+ left-1);
} else {
// 每个线程负责下载一定的numPerThred个字节
start=(int) (i * numPerThred);
end=(int) ((i + 1) * numPerThred);
end=(int) ((i + 1) * numPerThred)-1;

}
new DownloadThread(conn, start, end,OUT_FILE_NAME,barrier).start();
//Thread.sleep(1000);
}

} catch (Exception e) {
e.printStackTrace();
}finally{

conn.close();
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,13 @@ public void notifyFinished() {
}
}
System.out.println("下载完成!");

/**
* 网络资源的大小4812
开始读[0,1603]
开始读[1604,3207]
开始读[3208,4811]
下载完成!
*/


}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ public void testSubtract() {

@Test
public void testRemoveDuplicateValues() {
list.add(0);
list.add(3);
list.add(1);
list.add(22);
list.add(22);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,84 @@

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import com.m0312.download.api.Connection;

public class ConnectionImpl implements Connection{
URLConnection urlCon;
URL url;
static final int BUFFER_SIZE = 1024;
ConnectionImpl(String _url){
try {
url=new URL(_url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
@Override
public byte[] read(int startPos, int endPos) throws IOException {
byte[] buffer=new byte[endPos-startPos];
InputStream is=urlCon.getInputStream();
is.skip(startPos);
is.read(buffer, 0, endPos-startPos);
//只能写出第一部分
byte[] buffer=new byte[endPos-startPos+1];
HttpURLConnection urlCon2 = (HttpURLConnection)url.openConnection();
urlCon2.setRequestProperty("Range", "bytes=" + startPos + "-"
+ endPos);
InputStream is=urlCon2.getInputStream();
//is.skip(startPos);
is.read(buffer, 0, endPos-startPos+1);//因为没有+1,一直是只有三分之一部分
is.close();
return buffer;

/*HttpURLConnection httpConn = (HttpURLConnection)url.openConnection();

httpConn.setRequestProperty("Range", "bytes=" + startPos + "-"
+ endPos);

InputStream is = httpConn.getInputStream();

//is.skip(startPos);

byte[] buff = new byte[BUFFER_SIZE];

int totalLen = endPos - startPos + 1;
ByteArrayOutputStream baos = new ByteArrayOutputStream();

while(baos.size() < totalLen){

int len = is.read(buff);
if (len < 0) {
break;
}
baos.write(buff,0, len);
System.out.println("is read length: "+len);
System.out.println("baos.size: "+baos.size());
}
if(baos.size() > totalLen){
byte[] data = baos.toByteArray();
return Arrays.copyOf(data, totalLen);
}
return baos.toByteArray();
*/
/**
* 开始读[0,1603]
开始读[1604,3207]
is read length: 1024
is read length: 1024
baos.size: 1024
baos.size: 1024
开始读[3208,4811]
is read length: 580
baos.size: 1604 ///size会累积,等于度过的所有buffer size
is read length: 1024
baos.size: 1024
is read length: 580
baos.size: 1604
is read length: 580
baos.size: 1604
*/
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class ConnectionManagerImpl implements ConnectionManager {

@Override
public Connection open(String url) throws ConnectionException {
Connection con=new ConnectionImpl();
Connection con=new ConnectionImpl(url);

try {
URL website = new URL(url);
Expand Down
26 changes: 26 additions & 0 deletions group14/1091149131/2017JavaPro/src/com/test/TestDemo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.test;

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;

public class TestDemo {

@Before
public void setUp() throws Exception {
}

@Test
public void test() {
String str="123bbb45ddd5ccc567ddd012";
String[] data=str.split("[0-9]+");
System.out.println("共拆分"+data.length);
for (String s : data) {
System.out.println(s);
}
System.out.println("====");
fail("Not yet implemented");
}

}
37 changes: 37 additions & 0 deletions group14/1091149131/2017JavaPro/src/com/test/TestThread.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.test;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
/**
* 所有线程都写完后,才能进行下面任务
* @author Joy
*/
public class TestThread {
public static void main(String[] args) {
int N = 3;
CyclicBarrier barrier = new CyclicBarrier(N);
for(int i=0;i<N;i++)
new Writer(barrier).start();
}
static class Writer extends Thread{
private CyclicBarrier cyclicBarrier;
public Writer(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
}

@Override
public void run() {
System.out.println("线程"+Thread.currentThread().getName()+"正在写入数据...");
try {
Thread.sleep(5000); //以睡眠来模拟写入数据操作
System.out.println("线程"+Thread.currentThread().getName()+"写入数据完毕,等待其他线程写入完毕");
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
}catch(BrokenBarrierException e){
e.printStackTrace();
}
System.out.println("所有线程写入完毕,继续处理其他任务...");
}
}
}
65 changes: 65 additions & 0 deletions group14/1091149131/2017JavaPro/src/com/test/TestThread2.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.test;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
/**
* 在TestThread的基础上,为CyclicBarrier 加入runnable
* 在写完前,可以做其他事
* @author Joy
*/
public class TestThread2 {
public static void main(String[] args) {
int N = 4;
CyclicBarrier barrier = new CyclicBarrier(N,new Runnable() {
@Override
public void run() {
System.out.println("当前线程"+Thread.currentThread().getName());
}
});

for(int i=0;i<N;i++)
new Writer(barrier).start();
/*for(int i=0;i<N;i++) {
if(i<N-1)
new Writer(barrier).start();
else {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Writer(barrier).start();
}
}*/

}
static class Writer extends Thread{
private CyclicBarrier cyclicBarrier;
public Writer(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
}

@Override
public void run() {
System.out.println("线程"+Thread.currentThread().getName()+"正在写入数据...");
try {
Thread.sleep(5000); //以睡眠来模拟写入数据操作
System.out.println("线程"+Thread.currentThread().getName()+"写入数据完毕,等待其他线程写入完毕");
cyclicBarrier.await();
System.out.println("线程"+Thread.currentThread().getName()+"在await后面");
//cyclicBarrier.await(2000, TimeUnit.MILLISECONDS);//await指定时间,故意让其中一个线程拖延时间

} catch (InterruptedException e) {
e.printStackTrace();
}catch(BrokenBarrierException e){
e.printStackTrace();
} /*catch (TimeoutException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
System.out.println("所有线程写入完毕,继续处理其他任务...");
}
}
}
Loading