前幾天老姐突然告訴我,她在jd上買了本電子圖書,如何買完發(fā)現(xiàn),只能在線或者使用它自己的閱讀器看,很不方便,讓我給想想辦法。
如何我就開始琢磨,最開始,我直接使用acrobat reader打開,發(fā)現(xiàn)只有目錄,沒有其他,而且頁面上面的都存在,我想可能在正確的內(nèi)容上增加了一塊蒙版,只能用"鑰匙"的人可以過濾它,要破解別人的編輯器,短時間肯定是不行的的,網(wǎng)上也有很多人想到的是使用自動化腳本去自動對官方閱讀器截圖,但是我發(fā)現(xiàn),截圖不是一頁一頁的,這就很懵逼了。最后只能通過在線閱讀這條線來想辦法。
這個辦法和網(wǎng)友的類似,都是保存為圖片,如何通過pdf工具制作成pdf。
在線閱讀驚奇發(fā)現(xiàn),文檔真好,一頁一張圖片,它已經(jīng)給你做好,只是每次只更新出當前頁的前后幾張,其他的會被清除。到這里,思路就有了:
- 跳轉(zhuǎn)到第n頁
- 拉取刷新出來的額圖片路徑
- 保存圖片路徑到緩存(我使用的是redis)
- 通過網(wǎng)絡工具類,將緩存中的圖片地址全部下載到本地本次為圖片
- 將圖片通過pdf工作轉(zhuǎn)為pdf
第1步到第3步需要重復,可以使用自動工具和腳本來實現(xiàn)。
第4步寫個控制器就可以了,最簡單的java接口就行。
第5步直接網(wǎng)上在線服務就可以實現(xiàn)。
為什么需要先緩存在下載咧,這里涉及到一個效率與圖片去重和過濾的問題,因為每次調(diào)整后獲取的圖片可能有重復的,存在redis的map中,自動就去重了;也是為了避免一邊獲取圖片路徑,一邊下載中途異常退出等任務不能正常執(zhí)行完畢等問題。然后腳本獲取路徑,后保存到自己的服務器,唯一的問題可能就是跨域的問題。結(jié)果發(fā)現(xiàn)還是少了幾張圖,這樣就體會出使用緩存的好處了,可以直接通過代碼驗證少了那幾張圖,不用去檢查jpg文件,少的文件個位數(shù),最后通過手動補全了。
通過這種方式得到的圖片,唯一缺陷就是帶有"jd讀書"字樣和圖片分辨率不是很高,字體好像帶點毛腳。有強迫癥或者追求高品質(zhì)的,就使用官方閱讀器吧,個人看了蠻清晰的,是文檔,不是圖片!!!
下面附上java通過url獲取網(wǎng)絡數(shù)據(jù)保存到本地的代碼。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
public class httpurlconnectionutil { // 通過get請求得到讀取器響應數(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 ; } // 將服務器響應的數(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)用:
1
2
3
4
5
6
7
8
9
10
|
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讀取遠程數(shù)據(jù)并保持到本地的實例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網(wǎng)站的支持!
原文鏈接:http://blog.51cto.com/yuqian2203/2135284