前幾天老姐突然告訴我,她在JD上買了本電子圖書,如何買完發現,只能在線或者使用它自己的閱讀器看,很不方便,讓我給想想辦法。
如何我就開始琢磨,最開始,我直接使用Acrobat Reader打開,發現只有目錄,沒有其他,而且頁面上面的都存在,我想可能在正確的內容上增加了一塊蒙版,只能用"鑰匙"的人可以過濾它,要破解別人的編輯器,短時間肯定是不行的的,網上也有很多人想到的是使用自動化腳本去自動對官方閱讀器截圖,但是我發現,截圖不是一頁一頁的,這就很懵逼了。最后只能通過在線閱讀這條線來想辦法。
這個辦法和網友的類似,都是保存為圖片,如何通過pdf工具制作成pdf。
在線閱讀驚奇發現,文檔真好,一頁一張圖片,它已經給你做好,只是每次只更新出當前頁的前后幾張,其他的會被清除。到這里,思路就有了:
第1步到第3步需要重復,可以使用自動工具和腳本來實現。
第4步寫個控制器就可以了,最簡單的java接口就行。
第5步直接網上在線服務就可以實現。
為什么需要先緩存在下載咧,這里涉及到一個效率與圖片去重和過濾的問題,因為每次調整后獲取的圖片可能有重復的,存在redis的map中,自動就去重了;也是為了避免一邊獲取圖片路徑,一邊下載中途異常退出等任務不能正常執行完畢等問題。然后腳本獲取路徑,后保存到自己的服務器,唯一的問題可能就是跨域的問題。結果發現還是少了幾張圖,這樣就體會出使用緩存的好處了,可以直接通過代碼驗證少了那幾張圖,不用去檢查jpg文件,少的文件個位數,最后通過手動補全了。
通過這種方式得到的圖片,唯一缺陷就是帶有"JD讀書"字樣和圖片分辨率不是很高,字體好像帶點毛腳。有強迫癥或者追求高品質的,就使用官方閱讀器吧,個人看了蠻清晰的,是文檔,不是圖片?。?!
下面附上java通過URL獲取網絡數據保存到本地的代碼。
public class HttpURLConnectionUtil {// 通過get請求得到讀取器響應數據的數據流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;}// 將服務器響應的數據流存到本地文件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(); }}}
調用:
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);});
總結
以上所述是小編給大家介紹的java通過url讀取遠程數據并保持到本地的實例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!
新聞熱點
疑難解答
圖片精選