1. 程式人生 > >java網路程式設計之下載檔案通過多執行緒分塊下載(二)

java網路程式設計之下載檔案通過多執行緒分塊下載(二)


importjava.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.URL;
/**
     實現思路:將檔案分成 n塊,每塊用不同執行緒去下載,


 * 檔案下載工具 by sam on 2015/11/5.
 */
public final class FileUtil {

    /**
     * 單執行緒下載檔案
     *
     * 
@param url 檔案的網路地址 * @param path 儲存的檔案路徑 * @param threadNum 想要開啟的執行緒數 */ public static void dowanload(String url, String path, int threadNum) throws IOException { System.out.println("下載中..."); InputStream inputStream = null; RandomAccessFile randomAccessFile = null;
try { HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setConnectTimeout(10 * 1000); File file = new File(path); if (!file.getParentFile().exists()) file.getParentFile().mkdir();
if (file.exists()) file.delete(); file.createNewFile(); int responseCode = urlConnection.getResponseCode(); if (responseCode >= 200 && responseCode < 300) { int fileSize = urlConnection.getContentLength();//獲取檔案大小 randomAccessFile = new RandomAccessFile(file, "rwd"); randomAccessFile.setLength(fileSize);//設定檔案大小 randomAccessFile.close();//設定檔案大小後關閉 //獲取執行緒要處理的塊數 int value = fileSize % threadNum; int unit = fileSize/threadNum;//檔案平均每塊大小 int block = 0 == value ? threadNum: threadNum + 1; //如果不整除,分多一塊處理 for (int i = 0; i < block; i++) { int startMark = i * unit;//開始下載位置 int endMark = (i + 1) * unit - 1;//下載末端位置 DownloadFileThread thread = new DownloadFileThread(url, file, startMark, endMark); thread.start(); } } else { System.out.println("伺服器異常..."); } } finally { if (null != inputStream) { inputStream.close(); } if (null != randomAccessFile) { randomAccessFile.close(); } } } /*** * 下載檔案塊執行緒 */ private static class DownloadFileThread extends Thread { private String url; private File file; private int startMark; private int endMark; public DownloadFileThread(String url, File file, int startMark, int endMark) { this.url = url; this.file = file; this.startMark = startMark; this.endMark = endMark; } @Override public void run() { InputStream inputStream = null; RandomAccessFile randomAccessFile = null; try { HttpURLConnection urlConnection = (HttpURLConnection) new URL(url).openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setConnectTimeout(10 * 1000); //請求指定檔案的位置,表明當前的一塊獲取的開始下載位置到末端位置 urlConnection.setRequestProperty("Range", "bytes="+startMark+"-"+endMark); int responseCode = urlConnection.getResponseCode(); if (responseCode >= 200 && responseCode < 300) { inputStream = urlConnection.getInputStream(); int len = 0; byte[] data = new byte[4096]; randomAccessFile = new RandomAccessFile(file, "rwd"); randomAccessFile.seek(startMark);//設定往檔案寫入部分 while (-1 != (len = inputStream.read(data))) { randomAccessFile.write(data, 0, len); } System.out.println("下載完成..."+getName()); } else { System.out.println("伺服器異常..."); } } catch (Exception ex) { } finally { if (null != inputStream) { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != randomAccessFile) { try { randomAccessFile.close(); } catch (IOException e) { e.printStackTrace(); } } } } } public static void main(String[] args) throws IOException { String path = "D:\\abc\\abc.jpg"; String url = "http://www.dowei.com/d/file/mingxing/bagua/20151105/9e88df8cd5dd243b31eff7a4f7d53f89.jpg"; FileUtil.dowanload(url, path, 4); } }

相關推薦

java網路程式設計下載檔案通過執行下載()

importjava.io.File; import java.io.IOException; import java.io.InputStream; import java.io.RandomAccessFile; import java.net.HttpURLConn

Java高併發程式設計第一階段,執行基礎深入淺出

汪文君高併發程式設計第一階段01講-課程大綱及主要內容介紹 汪文君高併發程式設計第一階段02講-簡單介紹什麼是執行緒 汪文君高併發程式設計第一階段03講-建立並啟動執行緒 汪文君高併發程式設計第一階段04講-執行緒生命週期以及start方法原始碼剖析 汪文君高併發程式設計第

Java併發程式設計(8):執行環境中安全使用集合API(含程式碼)

Java併發程式設計(8):多執行緒環境中安全使用集合API(含程式碼)JAVA大資料中高階架構 2018-11-09 14:44:47在集合API中,最初設計的Vector和Hashtable是多執行緒安全的。例如:對於Vector來說,用來新增和刪除元素的方法是同步的。如果只有一個執行緒與Vector的例

Windows網路程式設計(五):執行訊息處理

對於服務端來說,呼叫accept()函式同意客戶端連線的請求後,需要處理完與這個客戶端的通訊後回到accept()繼續等待下一個客戶端的連線,如果一個客戶端請求連線時服務端並沒有在accept()處等待,客戶端是無法成功連上服務端的,因此併發客戶端連線的服務端必然是多執行緒的。 服務

JAVA網路程式設計實戰應用——雙向聊天(執行

控制檯雙向聊天 Code Code 以下如果有些流不懂的話,看我之前關於IO流的文章 要先啟動服務端(Server),再啟動客戶端(Client) 必須要保證埠一致 Socket socket = new Socket(“lo

Java網路爬蟲(十)--使用執行提升爬蟲效能的思路小結

在開始說正事之前我先給大家介紹一下這份程式碼的背景,以免大家有一種霧裡看花的感覺。在本系列的前幾篇部落格中有一篇是用多執行緒進行百度圖片的抓取,但是當時使用的多執行緒是非常粗略的,只是開了幾個執行緒讓抓取的速度提升了一些(其實提升了很多),初步的使用了一下執行緒

Java網路爬蟲(八)--使用執行進行百度圖片的抓取

宣告:如需轉載本篇文章,請進行私聊並在文章首處註明出處,本程式碼未經授權不可用於獲取商業價值,否則後果將由自己承擔。 這次的需求大概是從百度圖片裡面抓取任意的分類的圖片,考慮到有些圖片的資源不是很好,並且由於百度搜索越到後面相關度會越來越低,所以我將每個分類要

Python 執行檔案

這裡參考了這篇文章 https://gist.github.com/friskfly/4412375 ,然後加上自己的理解和應用, 整理如下:  # -*- coding: utf-8 -*- import os,time import threading import

Java網路程式設計執行下載檔案設定顯示進度(一)

下載檔案的時候,如果為了使用者友好,都會給予進度條提醒使用者,那麼怎麼做呢? 其實很簡單,首先獲取伺服器檔案的大小urlConnection.getContentLength(),然後在讀取檔案過程計算檔案百分比增長即可 /** * 檔案下載工具 by sam on

Java網路程式設計執行Client-Server

前面廢話過了,現在就直接看程式碼吧! ThreadedClient.java package exercise01; import java.io.*; import java.net.*; public class ThreadedClient { privat

java併發程式設計使用 CountDownLatch 控制執行執行順序

有時候會有這樣的需求,多個執行緒同時工作,然後其中幾個可以隨意併發執行,但有一個執行緒需要等其他執行緒工作結束後,才能開始。舉個例子,開啟多個執行緒分塊下載一個大檔案,每個執行緒只下載固定的一截,最後由另外一個執行緒來拼接所有的分段,那麼這時候我們可以考慮使用CountDownLatch來控制併發。

ios開發網路-大檔案執行斷點下載

說明:本文介紹多執行緒斷點續傳。專案中使用了蘋果自帶的類,實現了同時開啟多條執行緒下載一個較大的檔案。 因為實現過程較為複雜, 實現思路:下載 開始,建立一個與要下載檔案大小相同的檔案(如果要下載100M,那麼就在沙盒建立一個100M的檔案,然後計算每一段的下載量,開啟多條執行緒下載各段的資料,分

Java 併發程式設計系列帶你瞭解執行

早期的計算機不包含作業系統,它們從頭到尾執行一個程式,這個程式可以訪問計算機中的所有資源。在這種情況下,每次都只能執行一個程式,對於昂貴的計算機資源來說是一種嚴重的浪費。 作業系統出現後,計算機可以執行多個程式,不同的程式在單獨的程序中執行。作業系統負責為各個獨

Java網路程式設計例子2_TCP檔案上傳

注意:網路程式設計的正常步驟先跑服務端,再跑客戶端; 第一步先用eclipse執行server端; 第二步用命令列執行客戶端; 檢視結果: 把檔案copy出去改下字尾,發現檔案可以開啟 package cn.njit.internet.fileUploa

Java網路程式設計Socket

原文博主禁止轉載,不過我還是希望把一些關鍵的地方筆記下來,閱讀請移步 原文 以下是學習之後的個人筆記 一、Socket通訊基本例項   通過伺服器-客戶端模式引入Socket通訊 伺服器端 package cn.itcast.net; import java.io

Java網路程式設計URL和URI

URL和URI URL可以唯一地標識一個資源在Internet上的位置。URL是最常見的URI URI URI的結構: 模式:模式特定部分 常見的模式有: data file ftp http mailto magnet teln

Java網路程式設計Socket通訊(一)

       最近在學習Java網路程式設計,之前聽說過,但是一直都沒有認真瞭解過。這幾天突然來了興致,覺得很神奇,忽然就想要了解下具體是什麼個情況。         Socket通常也稱作"套接字",用於描述IP地址和埠,是一個通訊鏈的控制代碼。在Internet上的主機

Java網路程式設計URLEncode和URLDecode工具類

import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; public class EncodeTest {

JAVA網路程式設計模擬表單提交

這一篇部落格是對上一篇《JAVA網路程式設計之獲取網路資源》的擴充,這一篇將使用HttpURLConnection來模擬一個表單的提交。在B/S架構的系統中,請求時通過瀏覽器與服務端進行互動的,提交請求引數時使用form表單進行提交,但是有很多時候,我們需要在程

Java網路程式設計Netty拆包和黏包-yellowcong

Netty中,解決拆包和黏包中,解決方式有三種 1、在每個包尾部,定義分隔符,通過回車符號,或者其他符號來解決 2、通過定義每個包的大小,如果包不夠就空格填充 3、自定義協議的方式,將訊息分為訊息頭和訊息體,在訊息頭中表示出訊息的總長度,