如何實現java檔案佇列下載
在Internet上很多的資源分成多個檔案存放時,它的檔案命名是有一定的規則的;正因如此,我們就可以用程式來完成這個資源的完全下載。
1. 基礎知識
在Internet上,我們要下載網站上的某個資源,我們會獲得一個URL(Uniform Resource Locator),它是一個伺服器資源定位的描述,下載的過程總是如下步驟:
步驟1:客戶端發起連線請求一個URL
步驟2:伺服器解析URL,並將指定的資源返回一個輸入流給客戶
步驟3:客戶端接收輸入流,將流中的內容存到檔案
2. 網路連線的建立
步驟2:伺服器解析URL,並將指定的資源返回一個輸入流給客戶
步驟3:客戶端接收輸入流,將流中的內容存到檔案
2. 網路連線的建立
Java提供了對URL訪問和大量的流操作的的API,我們可以很容易的完成對網路上資源的存取,下面的程式碼段就完成了對一個網站的資源進行訪問:
......
destUrl="http://www.ebook.com/java/網路程式設計001.zip";
url = new URL(destUrl); httpUrl = (HttpURLConnection) url.openConnection();
//連線指定的網路資源
httpUrl.connect();
//獲取網路輸入流
bis = new BufferedInputStream(httpUrl.getInputStream());
......
destUrl="http://www.ebook.com/java/網路程式設計001.zip";
url = new URL(destUrl); httpUrl = (HttpURLConnection) url.openConnection();
//連線指定的網路資源
httpUrl.connect();
//獲取網路輸入流
bis = new BufferedInputStream(httpUrl.getInputStream());
......
3. 代理的訪問
Java 中通過代理伺服器訪問外網的方法已經是世人皆知的祕密了。這裡就不再多描述了,訪問的Java程式碼如下:
//設定代理伺服器
System.getProperties().put("proxySet", "true");
System.getProperties().put("proxyHost", "10.154.134.110");
System.getProperties().put("proxyPort", "8080");
System.getProperties().put("proxySet", "true");
System.getProperties().put("proxyHost", "10.154.134.110");
System.getProperties().put("proxyPort", "8080");
4. 網路資源的儲存
在上節中,我們已經獲取了指定網路資源的輸入流,接下來我們要完成的就是讀取輸入流中的所以內容,並將其儲存在檔案中。 示例程式碼:
......
fos = new FileOutputStream(fileName);
if (this.DEBUG)
System.out.println("正在獲取連結[" + destUrl + "]的內容.../n將其儲存為檔案[" + fileName +"]");
//儲存檔案
while ( (size = bis.read(buf)) != -1)
fos.write(buf, 0, size); ......
fos = new FileOutputStream(fileName);
if (this.DEBUG)
System.out.println("正在獲取連結[" + destUrl + "]的內容.../n將其儲存為檔案[" + fileName +"]");
//儲存檔案
while ( (size = bis.read(buf)) != -1)
fos.write(buf, 0, size); ......
上面的示例程式碼就將網路資源的內容儲存到了本地指定的檔案中。
5. 程式碼清單
import java.io.*;
import java.net.*;
import java.util.*;
/**
* <p>Description: 將指定的HTTP網路資源在本地以檔案形式存放</p>
* <p>Copyright: </p>
* <p>Company: </p>
* @author
* @version 1.0
*/
public class HttpGet {
public final static boolean DEBUG = true;//除錯用
private static int BUFFER_SIZE = 8096;//緩衝區大小
private Vector vDownLoad = new Vector();//URL列表
private Vector vFileList = new Vector();//下載後的儲存檔名列表
/**
* 構造方法
*/
public HttpGet() {
}
/**
* 清除下載列表
*/
public void resetList() {
vDownLoad.clear();
vFileList.clear();
}
/**
* 增加下載列表項
*
* @param url String
* @param filename String
*/
public void addItem(String url, String filename) {
vDownLoad.add(url);
vFileList.add(filename);
}
/**
* 根據列表下載資源
*/
public void downLoadByList() {
String url = null;
String filename = null;
//按列表順序儲存資源
for (int i = 0; i < vDownLoad.size(); i++) {
url = (String) vDownLoad.get(i);
filename = (String) vFileList.get(i);
try {
saveToFile(url, filename);
}
catch (IOException err) {
if (DEBUG) {
System.out.println("資源[" + url + "]下載失敗!!!");
}
}
}
if (DEBUG) {
System.out.println("下載完成!!!");
}
}
/**
* 將HTTP資源另存為檔案
*
* @param destUrl String
* @param fileName String
* @throws Exception
*/
public void saveToFile(String destUrl, String fileName) throws IOException {
FileOutputStream fos = null;
BufferedInputStream bis = null;
HttpURLConnection httpUrl = null;
URL url = null;
byte[] buf = new byte[BUFFER_SIZE];
int size = 0;
//建立連結
url = new URL(destUrl);
httpUrl = (HttpURLConnection) url.openConnection();
//連線指定的資源
httpUrl.connect();
//獲取網路輸入流
bis = new BufferedInputStream(httpUrl.getInputStream());
//建立檔案
fos = new FileOutputStream(fileName);
if (this.DEBUG)
System.out.println("正在獲取連結[" + destUrl + "]的內容.../n將其儲存為檔案[" + fileName + "]");
//儲存檔案
while ( (size = bis.read(buf)) != -1)
fos.write(buf, 0, size);
fos.close();
bis.close();
httpUrl.disconnect();
}
/**
* 設定代理伺服器
*
* @param proxy String
* @param proxyPort String
*/
public void setProxyServer(String proxy, String proxyPort) {
//設定代理伺服器
System.getProperties().put("proxySet", "true");
System.getProperties().put("proxyHost", proxy);
System.getProperties().put("proxyPort", proxyPort);
}
/**
* 設定認證使用者名稱與密碼
*
* @param uid String
* @param pwd String
*/
public void setAuthenticator(String uid, String pwd) {
Authenticator.setDefault(new MyAuthenticator(uid, pwd));
}
/**
* 主方法(用於測試)
*
* @param argv String[]
*/
public static void main(String argv[]) {
HttpGet oInstance = new HttpGet();
try {
//增加下載列表(此處使用者可以寫入自己程式碼來增加下載列表)
oInstance.addItem("http://www.ebook.com/java/網路程式設計001.zip","./網路程式設計1.zip");
oInstance.addItem("http://www.ebook.com/java/網路程式設計002.zip","./網路程式設計2.zip");
oInstance.addItem("http://www.ebook.com/java/網路程式設計003.zip","./網路程式設計3.zip");
oInstance.addItem("http://www.ebook.com/java/網路程式設計004.zip","./網路程式設計4.zip");
oInstance.addItem("http://www.ebook.com/java/網路程式設計005.zip","./網路程式設計5.zip");
oInstance.addItem("http://www.ebook.com/java/網路程式設計006.zip","./網路程式設計6.zip");
oInstance.addItem("http://www.ebook.com/java/網路程式設計007.zip","./網路程式設計7.zip");
//開始下載
oInstance.downLoadByList();
}
catch (Exception err) {
System.out.println(err.getMessage());
}
}
}
相關文章
- Java實現檔案下載功能Java
- Java程式碼實現下載檔案Java
- java實現檔案的下載的方法概述Java
- java實現sftp檔案的上傳下載JavaFTP
- Flutter實現檔案下載Flutter
- AJAX實現檔案下載----
- Java多執行緒檔案分片下載實現Java執行緒
- Java實現多檔案邊壓縮邊下載Java
- Java實現上傳檔案到Oracle及從Oracle下載檔案JavaOracle
- Flutter 實現檔案下載功能Flutter
- Weex 實現檔案的下載
- servlet實現檔案下載demoServlet
- Django 實現下載檔案功能Django
- 利用IhttpHandler實現檔案下載HTTP
- 使用Servlet實現檔案下載Servlet
- 教你如何實現c#檔案上傳下載功能C#
- 在ofbiz體系中如何實現檔案下載?
- 【資料結構】佇列(順序佇列、鏈佇列)的JAVA程式碼實現資料結構佇列Java
- js下載檔案的實現方式JS
- js實現txt/excel檔案下載JSExcel
- vc實現https檔案下載HTTP
- 02vue+axios+form實現檔案下載(附Java實現程式碼)VueiOSORMJava
- vue/js實現檔案流下載,檔案下載進度監聽VueJS
- 如何用RabbitMQ實現延遲佇列MQ佇列
- 通過佇列實現棧OR通過棧實現佇列佇列
- Feign實現檔案上傳下載
- PowerShell實現檔案下載(類wget)wget
- jsp下載檔案的實現方法JS
- Java面試題:棧和佇列的實現Java面試題佇列
- javascript實現佇列JavaScript佇列
- Java檔案上傳如何實現呢?Java
- JAVA檔案上傳下載Java
- Java中不可變的佇列如何實現? - XP123Java佇列
- 如何實現MQ佇列訊息監控MQ佇列
- JavaScript 中如何實現函式佇列?(一)JavaScript函式佇列
- Vue實現點選按鈕進行檔案下載(後端Java)Vue後端Java
- JAVA記憶體對映檔案實現多執行緒下載Java記憶體執行緒
- 用java實現基於http協議的網路檔案下載JavaHTTP協議