java通過url讀取遠(yuǎn)程數(shù)據(jù)并保持到本地的實(shí)例代碼
前幾天老姐突然告訴我,她在JD上買了本電子圖書,如何買完發(fā)現(xiàn),只能在線或者使用它自己的閱讀器看,很不方便,讓我給想想辦法。
如何我就開始琢磨,最開始,我直接使用Acrobat Reader打開,發(fā)現(xiàn)只有目錄,沒有其他,而且頁面上面的都存在,我想可能在正確的內(nèi)容上增加了一塊蒙版,只能用"鑰匙"的人可以過濾它,要破解別人的編輯器,短時(shí)間肯定是不行的的,網(wǎng)上也有很多人想到的是使用自動化腳本去自動對官方閱讀器截圖,但是我發(fā)現(xiàn),截圖不是一頁一頁的,這就很懵逼了。最后只能通過在線閱讀這條線來想辦法。
這個(gè)辦法和網(wǎng)友的類似,都是保存為圖片,如何通過pdf工具制作成pdf。
在線閱讀驚奇發(fā)現(xiàn),文檔真好,一頁一張圖片,它已經(jīng)給你做好,只是每次只更新出當(dāng)前頁的前后幾張,其他的會被清除。到這里,思路就有了:
- 跳轉(zhuǎn)到第n頁
- 拉取刷新出來的額圖片路徑
- 保存圖片路徑到緩存(我使用的是redis)
- 通過網(wǎng)絡(luò)工具類,將緩存中的圖片地址全部下載到本地本次為圖片
- 將圖片通過pdf工作轉(zhuǎn)為pdf
第1步到第3步需要重復(fù),可以使用自動工具和腳本來實(shí)現(xiàn)。
第4步寫個(gè)控制器就可以了,最簡單的java接口就行。
第5步直接網(wǎng)上在線服務(wù)就可以實(shí)現(xiàn)。
為什么需要先緩存在下載咧,這里涉及到一個(gè)效率與圖片去重和過濾的問題,因?yàn)槊看握{(diào)整后獲取的圖片可能有重復(fù)的,存在redis的map中,自動就去重了;也是為了避免一邊獲取圖片路徑,一邊下載中途異常退出等任務(wù)不能正常執(zhí)行完畢等問題。然后腳本獲取路徑,后保存到自己的服務(wù)器,唯一的問題可能就是跨域的問題。結(jié)果發(fā)現(xiàn)還是少了幾張圖,這樣就體會出使用緩存的好處了,可以直接通過代碼驗(yàn)證少了那幾張圖,不用去檢查jpg文件,少的文件個(gè)位數(shù),最后通過手動補(bǔ)全了。
通過這種方式得到的圖片,唯一缺陷就是帶有"JD讀書"字樣和圖片分辨率不是很高,字體好像帶點(diǎn)毛腳。有強(qiáng)迫癥或者追求高品質(zhì)的,就使用官方閱讀器吧,個(gè)人看了蠻清晰的,是文檔,不是圖片!?。?/p>
下面附上java通過URL獲取網(wǎng)絡(luò)數(shù)據(jù)保存到本地的代碼。
public class HttpURLConnectionUtil {
// 通過get請求得到讀取器響應(yīng)數(shù)據(jù)的數(shù)據(jù)流
public static InputStream getInputStreamByGet(String url) {
try {
HttpURLConnection conn = (HttpURLConnection) new URL(url)
.openConnection();
conn.setReadTimeout(5000);
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
InputStream inputStream = conn.getInputStream();
return inputStream;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
// 將服務(wù)器響應(yīng)的數(shù)據(jù)流存到本地文件
public static void saveData(InputStream is, File file) {
try (BufferedInputStream bis = new BufferedInputStream(is);
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(file));) {
byte[] buffer = new byte[1024];
int len = -1;
while ((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
bos.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
調(diào)用:
Set<String> imgNumber = (Set<String>) redisTemplate.opsForHash().keys(MAP_KEY);
imgNumber.stream().forEach(e->{
String url = (String) redisTemplate.opsForHash().get(MAP_KEY,e);
String fileName = e+".jpg";
File file = new File("E:\\pdf圖片\\", fileName);
InputStream inputStream = HttpURLConnectionUtil
.getInputStreamByGet(url);
HttpURLConnectionUtil.saveData(inputStream, file);
});
總結(jié)
以上所述是小編給大家介紹的java通過url讀取遠(yuǎn)程數(shù)據(jù)并保持到本地的實(shí)例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
SpringBoot實(shí)現(xiàn)優(yōu)雅停機(jī)的流程步驟
優(yōu)雅停機(jī)(Graceful Shutdown) 是指在服務(wù)器需要關(guān)閉或重啟時(shí),能夠先處理完當(dāng)前正在進(jìn)行的請求,然后再停止服務(wù)的操作,本文給大家介紹了SpringBoot實(shí)現(xiàn)優(yōu)雅停機(jī)的流程步驟,需要的朋友可以參考下2024-03-03
使用graalvm為帶有反射功能的java代碼生成native?image的示例詳解
graalvm讓native鏡像支持反射的關(guān)鍵是利用json提前告訴它哪些類的哪些方法會被反射調(diào)用,然后它就能力在運(yùn)行時(shí)支持反射了,這篇文章主要介紹了如何使用graalvm為帶有反射功能的java代碼生成native?image,需要的朋友可以參考下2024-02-02
Springboot如何實(shí)現(xiàn)自定義異常數(shù)據(jù)
這篇文章主要介紹了Springboot如何實(shí)現(xiàn)自定義異常數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
spring boot微服務(wù)自定義starter原理詳解
這篇文章主要介紹了spring boot微服務(wù)自定義starter原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
解決Java 部署Tomcat時(shí)使用jni和jna調(diào)用DLL文件的問題
這篇文章主要介紹了解決Java 部署Tomcat時(shí)使用jni和jna調(diào)用DLL文件的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11

