Skip to content

Commit

Permalink
Merge pull request #2 from DonaldY/master
Browse files Browse the repository at this point in the history
合并组长的代码
  • Loading branch information
zhouliang58 authored Apr 4, 2017
2 parents c65e253 + 622be64 commit 50e46b8
Show file tree
Hide file tree
Showing 688 changed files with 38,681 additions and 2,197 deletions.
20 changes: 1 addition & 19 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

#################
## Eclipse
#################
Expand Down Expand Up @@ -258,24 +259,6 @@ tmp
RemoteSystemsTempFiles
.gitignore


build/
.idea/
.gradle/
*.class
# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.ear

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

#ide config
.metadata
.recommenders
.idea/
*.iml
Expand All @@ -286,4 +269,3 @@ target
*.DS_Store
liuxin/.DS_Store
liuxin/src/.DS_Store

1 change: 0 additions & 1 deletion group11/1310368322/GitHub/.gitignore

This file was deleted.

7 changes: 0 additions & 7 deletions group11/1310368322/GitHub/src/testGitHub.java

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,18 +1,31 @@
package Day_2017_2_20_DateStructure;
package Day_2017_2_26_FirstHomework;

public class ArrayList {


private static final int DEFAULT_SIZE = 10;
private static final int MAX_VALUE = 2147483647;
private Object[] elementData = new Object[DEFAULT_SIZE];
private Exception Exception;
private int size = 0;

public ArrayList(){
this(DEFAULT_SIZE);
}
public ArrayList(int defaultSize) {
rangCheckForConstructor(defaultSize);
elementData = new Object[defaultSize];
}

private Object[] elementData = new Object[10];

private Exception Exception;
private void rangCheckForConstructor(int defaultSize) {
if(defaultSize<0 || defaultSize>MAX_VALUE){
throw new IndexOutOfBoundsException("数值不合理");
}

}

public void add(Object o){
if(size>elementData.length){
elementData = ArrayList.grow(elementData, 10);
}
ensureCapacity();
for(int i = 0; i < elementData.length; i++){
if(null == elementData[i]){
elementData[i] = o;
Expand All @@ -21,13 +34,14 @@ public void add(Object o){
}
size++;
}
public void add(int index, Object o){
private void ensureCapacity() {
if(size>elementData.length){
elementData = ArrayList.grow(elementData, 10);
}
if(index<0){
System.out.println("Äú²åÈëµÄλÖÃÓÐÎó");
}
}
public void add(int index, Object o){
rangeCheckForAdd(index);
ensureCapacity();
int k = -1;
for(int i = index; i < elementData.length; i++){
if(null==elementData[i]){
Expand All @@ -41,6 +55,12 @@ public void add(int index, Object o){
elementData[index] = o;
size++;
}
private void rangeCheckForAdd(int index) {
if(index < 0 || index > this.size){// add 的元素只能在 [0,size](可以给size位置插元素,但不可以给size后插元素)
throw new IndexOutOfBoundsException("下标越界");
}

}
public Object get(int index){
return elementData[index];
}
Expand Down Expand Up @@ -72,7 +92,6 @@ public static Object[] grow(Object[] elementData2, int size){

public static void main(String[] args) {
ArrayList a = new ArrayList();
a.add("a");
a.getElementData();
System.out.println(a.size);
}
Expand Down
83 changes: 83 additions & 0 deletions group11/1310368322/src/ArrayUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package day_2017_2_26_SecondHomework;

import java.util.Arrays;

import javax.management.RuntimeErrorException;

public class ArrayUtil {

/* *
* 给定一个整形数组 a ,对该数组的值进行置换
* 例如: a = [7, 9, 30, 3], 置换后为 [3, 30, 9, 7]
* */

/*public ArrayUtil(int[] a2) {
this.a = a2;
}*/
public void reverseArray(int [] a){
if(null == a){
System.out.println("空指针----");
return;
}
int temp;
int last = a.length-1;
for (int i = 0; i < a.length/2; i++) {
temp = a[i];
a[i] = a[last];
a[last--] = temp;
}
}
public void print(int [] a){
if(null == a){
System.out.println("空指针----");
return;
}
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
}

/* *
* 现在有如下的一个数组, int oldArr[] = {1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5}
* 要求将以上数组中的值为 0 的项去掉,将不为 0 的值存入一个新的数组,生成的新数组为:
* {1,3,4,5,6,6,5,4,7,6,7,5}
* @param oldArray
* @return
*/
public int [] removeZero(int [] oldArray){
if(null == oldArray){
return null;
}
int count = 0;
int oldArrayLength = oldArray.length;
for(int i = 0; i < oldArrayLength;){
if(oldArray[i]==0){
for(int j = i; j < oldArrayLength -1; j++){
oldArray[j] = oldArray[j+1];
}
oldArrayLength--;
count++;
}else{
i++;
}
}
int [] target = new int[oldArray.length-count];
System.arraycopy(oldArray, 0, target, 0, oldArray.length-count);
return target;
}














}
39 changes: 39 additions & 0 deletions group11/1310368322/src/Download/DownloadThread.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package day_2017_3_8_ThreadHomework;

import java.io.RandomAccessFile;
import java.util.concurrent.CyclicBarrier;

import com.coderising.download.api.Connection;

public class DownloadThread extends Thread{

Connection conn;
int startPos;
int endPos;
CyclicBarrier barrier;
String localFile;
public DownloadThread(Connection conn, int startPos, int endPos,String localFile,CyclicBarrier barrier){
this.conn = conn;
this.startPos = startPos;
this.endPos = endPos;
this.localFile = localFile;
this.barrier = barrier;
}
public void run(){
try {
System.out.println("Begin to read [" + startPos + "-" + endPos + "]");
byte [] data = conn.read(startPos, endPos);
System.out.println("创建一个随机读取文件的对象");
RandomAccessFile file = new RandomAccessFile(localFile,"rw");
file.seek(startPos);
System.out.println("要写数据了");
file.write(data);
file.close();
conn.close();
System.out.println(this.currentThread().getName()+"once over");
barrier.await();
} catch (Exception e) {
// TODO: handle exception
}
}
}
114 changes: 114 additions & 0 deletions group11/1310368322/src/Download/FileDownloader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
package day_2017_3_8_ThreadHomework;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.concurrent.CyclicBarrier;

import com.coderising.download.api.Connection;
import com.coderising.download.api.ConnectionManager;
import com.coderising.download.api.DownloadListener;

public class FileDownloader {
private String url;
private String localFile;
DownloadListener listener;
ConnectionManager cm;

private static final int DOWNLOAD_THREAD_NUM = 3;
public FileDownloader(String _url,String localFile){
this.url = _url;
this.localFile = localFile;
}

public void execute(){
// 在这里实现你的代码, 注意: 需要用多线程实现下载
// 这个类依赖于其他几个接口,你需要写这几个接口的实现代码
// (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 方法

// 下面的代码是实例代码,也就是说只有一个线程,你需要改造成多线程的
CyclicBarrier barrier = new CyclicBarrier(DOWNLOAD_THREAD_NUM,new Runnable() {// 当所有的Thread都调用 await方法时,会执行后面的 barrierAction,调用后面这个线程
@Override
public void run() {
listener.notifyFinished();
}
});

Connection conn = null;
try {
conn = cm.open(this.url);
int length = conn.getContentLength();// 拿到将要下载文件的长度
createPlaceHolderFile(this.localFile,length);//占位
System.out.println("占位完毕");
int [][] ranges = allocateDownloadRange(DOWNLOAD_THREAD_NUM,length);// 给每个线程分配开始位置和结束位置
// 开始下载文件
System.out.println("开始下载文件");
for(int i = 0; i < DOWNLOAD_THREAD_NUM; i++){
DownloadThread thread = new DownloadThread(
cm.open(url),
ranges[i][0],
ranges[i][1],
localFile,
barrier);
thread.start();
System.out.println("第" + (i+1) + "个线程已经启动");
}

} catch (Exception e) {
e.printStackTrace();
}finally{
System.out.println("即将关闭连接");
if(conn != null){
conn.close();
System.out.println("关闭连接成功");
}
}
}

public void setListener(DownloadListener listener){
this.listener = listener;
}
public void setConnectionManager(ConnectionManager ucm){
this.cm = ucm;
}
public DownloadListener getListener(){
return this.listener;
}
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();
}
/**
* 给出线程数和文件长度,返回一个二维数组,里面存的是每个线程下载的开始位置和结束位置
* @param threadNum
* @param contentLen
* @return
*/
private int [][] allocateDownloadRange(int threadNum, int contentLen){
int [][] ranges = new int[threadNum][2];// 用二维数组存下每个线程的开始位置和结束位置

int eachThreadSize = contentLen / threadNum;// 每个线程需要下载的文件大小
int left = contentLen % threadNum;// 剩下的归最后一个线程来处理

for(int i = 0; i<threadNum; i++){
int startPos = i * eachThreadSize;
int endPos = (i+1) * eachThreadSize - 1;
if((i == (threadNum -1))){
endPos += left;
}
ranges[i][0] = startPos;
ranges[i][1] = endPos;
}

return ranges;
}
}
22 changes: 22 additions & 0 deletions group11/1310368322/src/Download/api/Connection.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
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;
/**
* 得到数据内容的长度
* @return
*/
public int getContentLength();
/**
* 关闭连接
*/
public void close();
}
7 changes: 7 additions & 0 deletions group11/1310368322/src/Download/api/ConnectionException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.coderising.download.api;

public class ConnectionException extends Exception{
public ConnectionException(Exception e){
super(e);
}
}
Loading

0 comments on commit 50e46b8

Please sign in to comment.