java實(shí)現(xiàn)從url路徑中下載pdf文檔到本地
這篇文章主要為大家介紹了如何從指定的網(wǎng)絡(luò)URL下載PDF文件。主要通過(guò)HttpURLConnection建立連接,設(shè)置超時(shí)和User-Agent,讀取輸入流并將其寫(xiě)入本地文件系統(tǒng)。以下是完整代碼:
package com.cellstrain.icell.util;
import java.io.*;
import java.net.*;
public class DownloadPdf {
/**
* 從網(wǎng)絡(luò)Url中下載文件
* @param urlStr
* @param fileName
* @param savePath
* @throws IOException
*/
public static void downLoadByUrl(String urlStr,String fileName,String savePath) throws IOException{
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
//設(shè)置超時(shí)間為3秒
conn.setConnectTimeout(5*1000);
//防止屏蔽程序抓取而返回403錯(cuò)誤
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
//得到輸入流
InputStream inputStream = conn.getInputStream();
//獲取自己數(shù)組
byte[] getData = readInputStream(inputStream);
//文件保存位置
File saveDir = new File(savePath);
if(!saveDir.exists()){
saveDir.mkdir();
}
File file = new File(saveDir+File.separator+fileName);
FileOutputStream fos = new FileOutputStream(file);
fos.write(getData);
if(fos!=null){
fos.close();
}
if(inputStream!=null){
inputStream.close();
}
System.out.println("info:"+url+" download success");
}
/**
* 從輸入流中獲取字節(jié)數(shù)組
* @param inputStream
* @return
* @throws IOException
*/
public static byte[] readInputStream(InputStream inputStream) throws IOException {
byte[] buffer = new byte[1024];
int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while((len = inputStream.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.close();
return bos.toByteArray();
}
public static void main(String[] args) {
try{
downLoadByUrl("https://www.mybiosource.com/images/tds/protocol_samples/MBS700_Antibody_Set_Sandwich_ELISA_Protocol.pdf",
"ELISA.pdf","E:/upload/protocol");
}catch (Exception e) {
// TODO: handle exception
}
}
}方法補(bǔ)充
1.java實(shí)現(xiàn)從url路徑中下載pdf文檔到本地
在開(kāi)始之前,確保你的計(jì)算機(jī)上安裝了Java開(kāi)發(fā)環(huán)境(JDK)。建議使用Java 8及以上版本。你可以使用任何開(kāi)發(fā)工具,例如Eclipse、IntelliJ IDEA或簡(jiǎn)單的文本編輯器。
下載PDF文檔的步驟
下載PDF文檔的步驟如下:
- 確定PDF文件的URL。
- 創(chuàng)建一個(gè)HTTP連接,向該URL發(fā)送請(qǐng)求。
- 讀取響應(yīng)內(nèi)容。
- 將內(nèi)容寫(xiě)入本地文件。
代碼示例
下面是一個(gè)簡(jiǎn)單的Java代碼示例,演示了如何從URL路徑下載PDF文檔到本地。
import java.io.BufferedInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class PdfDownloader {
public static void downloadPdf(String pdfUrl, String destinationFile) {
try {
URL url = new URL(pdfUrl);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("GET");
httpURLConnection.setDoOutput(true);
int responseCode = httpURLConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) { // 200 status code
InputStream inputStream = new BufferedInputStream(httpURLConnection.getInputStream());
FileOutputStream fileOutputStream = new FileOutputStream(destinationFile);
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, bytesRead);
}
fileOutputStream.close();
inputStream.close();
System.out.println("PDF downloaded successfully: " + destinationFile);
} else {
System.out.println("Failed to download PDF, response code: " + responseCode);
}
httpURLConnection.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String pdfUrl = " // 替換為實(shí)際PDF鏈接
String destinationFile = "downloaded.pdf"; // 目標(biāo)文件名
downloadPdf(pdfUrl, destinationFile);
}
}代碼詳解
- 導(dǎo)入必要的類:我們需要使用URLConnection和InputStream等類來(lái)處理網(wǎng)絡(luò)連接和讀取數(shù)據(jù)。
- 下載函數(shù):downloadPdf函數(shù)接受PDF文件的URL和本地文件路徑作為參數(shù),使用HttpURLConnection類創(chuàng)建HTTP連接。
- 讀取和寫(xiě)入數(shù)據(jù):成功連接后,通過(guò)輸入流讀取PDF數(shù)據(jù),并通過(guò)輸出流將其寫(xiě)入本地文件。
- 異常處理:使用try-catch語(yǔ)句處理可能出現(xiàn)的IOException異常。
2.Java根據(jù)URL下載文件到本地的2種方式(大型文件與小型文件)
a.小型文件推薦使用
代碼解析
- 首先創(chuàng)建了一個(gè)URL對(duì)象website,用來(lái)表示遠(yuǎn)程文件的地址。
- 然后創(chuàng)建了一個(gè)ReadableByteChannel對(duì)象rbc和一個(gè)FileOutputStream對(duì)象fos。ReadableByteChannel用于讀取遠(yuǎn)程文件的字節(jié)流,F(xiàn)ileOutputStream用于將讀取的內(nèi)容寫(xiě)入本地文件。
- 在try塊中,通過(guò)URL對(duì)象打開(kāi)一個(gè)連接并獲取其字節(jié)流,然后使用transferFrom方法將遠(yuǎn)程文件的內(nèi)容直接傳輸?shù)奖镜匚募?。這是NIO的一種高效的文件傳輸方式。
- 如果在上述過(guò)程中發(fā)生異常,將會(huì)捕獲并打印異常信息。
- 無(wú)論是否發(fā)生異常,最后都會(huì)執(zhí)行finally塊中的清理工作,關(guān)閉文件輸出流和遠(yuǎn)程字節(jié)流通道,以釋放資源。
實(shí)現(xiàn)代碼
public static void downloadFile(String remoteFilePath, String localFilePath) {
URL website = null;
ReadableByteChannel rbc = null;
FileOutputStream fos = null;
try {
website = new URL(remoteFilePath);
rbc = Channels.newChannel(website.openStream());
fos = new FileOutputStream(localFilePath);//本地要存儲(chǔ)的文件地址 例如:test.txt
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
} catch (Exception e) {
e.printStackTrace();
}finally{
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(rbc!=null){
try {
rbc.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}b.大型文件推薦使用
代碼解析
- 首先創(chuàng)建了一個(gè)URL對(duì)象url,用來(lái)表示要下載文件的地址。
- 使用URL對(duì)象打開(kāi)一個(gè)連接,并將其強(qiáng)制轉(zhuǎn)換為HttpURLConnection對(duì)象。HttpURLConnection是Java提供的用于發(fā)送HTTP請(qǐng)求和接收HTTP響應(yīng)的類。
- 通過(guò)連接獲取輸入流 inputStream,使用BufferedInputStream對(duì)輸入流進(jìn)行緩存。這是為了避免一次性讀取大文件造成內(nèi)存溢出。
- 創(chuàng)建一個(gè)File對(duì)象 file,表示要保存的本地文件。如果該文件已存在,則刪除之。
- 創(chuàng)建一個(gè)輸出流 outputStream,將文件作為輸出目標(biāo)。
- 創(chuàng)建一個(gè)字節(jié)數(shù)組 buffer,大小為5MB(1024 * 1024 * 5),用于緩存每次從輸入流中讀取的數(shù)據(jù)。
- 使用 while 循環(huán),不斷從輸入流中讀取數(shù)據(jù)到緩沖區(qū),然后將緩沖區(qū)的內(nèi)容寫(xiě)入輸出流。循環(huán)會(huì)一直進(jìn)行,直到輸入流的末尾。
- 關(guān)閉連接 connection,并在 finally 塊中關(guān)閉輸入流和輸出流。使用 IOUtils.closeQuietly 方法可以安全地關(guān)閉流,即使發(fā)生異常也不會(huì)拋出異常。
- 總的來(lái)說(shuō),這段代碼實(shí)現(xiàn)了從指定URL下載文件到本地的功能,并且通過(guò)緩存流和分塊讀取的方式,避免了一次性讀取大文件導(dǎo)致的內(nèi)存溢出問(wèn)題。同時(shí),在下載完成或出現(xiàn)異常后,也進(jìn)行了資源的關(guān)閉和釋放操作。
實(shí)現(xiàn)代碼
public static void downloadFile1(String downloadUrl, String path){
InputStream inputStream = null;
OutputStream outputStream = null;
try {
URL url = new URL(downloadUrl);
//這里沒(méi)有使用 封裝后的ResponseEntity 就是也是因?yàn)檫@里不適合一次性的拿到結(jié)果,放不下content,會(huì)造成內(nèi)存溢出
HttpURLConnection connection =(HttpURLConnection) url.openConnection();
//使用bufferedInputStream 緩存流的方式來(lái)獲取下載文件,不然大文件會(huì)出現(xiàn)內(nèi)存溢出的情況
inputStream = new BufferedInputStream(connection.getInputStream());
File file = new File(path);
if (file.exists()) {
file.delete();
}
outputStream = new FileOutputStream(file);
//這里也很關(guān)鍵每次讀取的大小為5M 不一次性讀取完
byte[] buffer = new byte[1024 * 1024 * 5];// 5MB
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
connection.disconnect();
}catch (Exception e){
e.printStackTrace();
}finally {
IOUtils.closeQuietly(outputStream);
IOUtils.closeQuietly(inputStream);
}
}到此這篇關(guān)于java實(shí)現(xiàn)從url路徑中下載pdf文檔到本地的文章就介紹到這了,更多相關(guān)java url下載pdf內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
windows系統(tǒng)上如何進(jìn)行maven安裝和配置方式
這篇文章主要介紹了windows系統(tǒng)上如何進(jìn)行maven安裝和配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-05-05
解決@PathVariable出現(xiàn)點(diǎn)號(hào).時(shí)導(dǎo)致路徑參數(shù)截?cái)喃@取不全的問(wèn)題
這篇文章主要介紹了解決@PathVariable出現(xiàn)點(diǎn)號(hào).時(shí)導(dǎo)致路徑參數(shù)截?cái)喃@取不全的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
JAVA中string數(shù)據(jù)類型轉(zhuǎn)換詳解
在JAVA中string是final類,提供字符串不可以修改,string類型在項(xiàng)目中經(jīng)常使用,下面給大家介紹了string七種數(shù)據(jù)類型轉(zhuǎn)換,需要的朋友可以參考下2015-07-07
Java8使用stream實(shí)現(xiàn)list中對(duì)象屬性的合并(去重并求和)
這篇文章主要介紹了Java8使用stream實(shí)現(xiàn)list中對(duì)象屬性的合并(去重并求和),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
Java模擬單鏈表和雙端鏈表數(shù)據(jù)結(jié)構(gòu)的實(shí)例講解
這篇文章主要介紹了Java模擬單鏈表和雙端鏈表數(shù)據(jù)結(jié)構(gòu)的實(shí)例,注意這里的雙端鏈表不是雙向鏈表,是在單鏈表的基礎(chǔ)上保存有對(duì)最后一個(gè)鏈接點(diǎn)的引用,需要的朋友可以參考下2016-04-04
Spring中的動(dòng)態(tài)數(shù)據(jù)源解讀
這篇文章主要介紹了關(guān)于Spring中的動(dòng)態(tài)數(shù)據(jù)源解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06

