读书人

Java多线程上载实现

发布时间: 2012-12-23 11:28:15 作者: rapoo

Java多线程下载实现

package com.test;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.io.RandomAccessFile;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.ProtocolException;import java.net.URL;public class DownLoadUtil {private String urlStr;private String targetFile;private int threadNum;private DownloadThread[] threads;private int fileSize;public DownLoadUtil(String urlStr, String targetFile, int threadNum) {this.urlStr = urlStr;this.targetFile = targetFile;this.threadNum = threadNum;this.threads = new DownloadThread[threadNum];}public void download() {try {HttpURLConnection conn = this.getHttpURLConnection();conn.setRequestProperty("Connection", "Keep-Alive");fileSize = conn.getContentLength();conn.disconnect();int currentPartSize = fileSize/threadNum + 1;RandomAccessFile file = new RandomAccessFile(targetFile, "rw");file.setLength(fileSize);file.close();for(int i=0; i<threadNum; i++) {int startPosition = currentPartSize * i;RandomAccessFile currentFile = new RandomAccessFile(targetFile, "rw");currentFile.seek(startPosition);threads[i] = new DownloadThread(startPosition, currentFile, currentPartSize);new Thread(threads[i]).start();}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}private class DownloadThread implements Runnable {private int startPosition;private RandomAccessFile downloadFile;private int currentPartSize;private int hasDownSize;public DownloadThread(int startPosition, RandomAccessFile downloadFile,int currentPartSize) {this.startPosition = startPosition;this.downloadFile = downloadFile;this.currentPartSize = currentPartSize;}@Overridepublic void run() {try {HttpURLConnection conn = getHttpURLConnection();InputStream in = conn.getInputStream();in.skip(this.startPosition);byte[] buffer = new byte[1024];int hasRead = 0;while (hasDownSize < currentPartSize &&(hasRead = in.read(buffer)) != -1) {downloadFile.write(buffer, 0, hasRead);hasDownSize += hasRead;}downloadFile.close();in.close();} catch (IOException e) {e.printStackTrace();}}}private HttpURLConnection getHttpURLConnection() {HttpURLConnection conn = null;try {URL url = new URL(urlStr);conn = (HttpURLConnection) url.openConnection();conn.setConnectTimeout(5 * 1000);conn.setRequestMethod("GET");conn.setRequestProperty("Accept","image/gif, image/jpeg, image/pjpeg, image/pjpeg, "+ "application/x-shockwave-flash, application/xaml+xml, "+ "application/vnd.ms-xpsdocument, application/x-ms-xbap, "+ "application/x-ms-application, application/vnd.ms-excel, "+ "application/vnd.ms-powerpoint, application/msword, */*");conn.setRequestProperty("Accept-Language", "zh-CN");conn.setRequestProperty("Charset", "UTF-8");} catch (MalformedURLException e) {e.printStackTrace();} catch (ProtocolException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return conn;}}

读书人网 >编程

热点推荐