java通过url读取远程数据并保持到本地
admin
2023-07-27 15:20:05
0

前几天老姐突然告诉我,她在JD上买了本电子图书,然后买完发现,只能在线或者使用它自己的阅读器看,很不方便,让我给想想办法。
然后我就开始琢磨,最开始,我直接使用Acrobat Reader打开,发现只有目录,没有其他,而且页面上面的都存在,我想可能在真正的内容上增加了一块蒙版,只能有"钥匙"的人可以过滤它,要破解别人的编辑器,短时间肯定是不行的,网上也有很多人想到使用自动化脚本去自动对官方阅读器截图,但是我发现,截图不是一页一页的,这就很懵逼了。最后只能通过在线阅读这条线来想办法。
这个办法和网友的类似,都是保存为图片,然后通过pdf工具制作成pdf。
在线阅读我惊奇发现,在线文档真好,一页一张图片,它已经给你做好,只是每次只更新出当前页的前后几张,其他的会被清除。到这里,思路就有了:

  1. 跳转到第n页
  2. 拉取刷新出来的额图片路径
  3. 保存图片路径到缓存(我使用的是redis)
  4. 通过网络工具类,将缓存中的图片地址全部下载到本地本次为图片
  5. 将图片通过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 imgNumber = (Set) 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);
});

此方法只适应已经购买了的电子书,未购买的不适用。建议还是到正规网站或书店购买,支持正版,尊重知识。

相关内容

热门资讯

浙江宣传:“走个面儿”咋就没面... “咱北京两千多万人口,您受累,您走个面儿,把这第一波的票房带起来,咱就有了。”某知名导演的新片首映礼...
辞职声明仅95秒遭质疑,韩国队... 【环球时报综合报道】美加墨世界杯小组赛出局后,韩国队主教练洪明甫当地时间28日在墨西哥的韩国队大本营...
美媒爆料:美军第五舰队总部遭伊... 据美国《华尔街日报》27日报道,其通过对卫星图像、社交媒体视频和五角大楼记录的分析发现,今年2月底至...
英国智库给菲律宾GDP增速“浇... 【环球时报特约记者 叶满】英国经济研究机构凯投宏观发布的最新一期《亚洲经济展望》报告(以下简称“报告...
欧洲持续高温,有华人用冰箱降温... 连日来,欧洲多国迎来罕见极端高温天气,法国、德国、意大利等地气温持续飙升,部分地区突破40摄氏度。受...
伊副外长强调船只须按“伊朗线路... 伊朗外交部副部长加里巴巴迪当地时间29日晚间在接受采访时强调,所有船只均须按照“伊朗线路”通过霍尔木...
委内瑞拉强震已致1719人死亡 当地时间29日,委内瑞拉全国代表大会主席罗德里格斯通报,地震已造成该国1719人死亡,5034人受伤...
铋晟新材料申请氯氧化铋基复合材... 国家知识产权局信息显示,江苏铋晟新材料有限公司申请一项名为“一种氯氧化铋基复合材料及其制备方法和用途...
韩国政府将投资千万亿韩元于AI... 韩国总统李在明29日在总统府青瓦台主持召开会议,公布总额超千万亿韩元的半导体、物理人工智能(AI)和...
以色列防长称以伊可能随时再起冲... △卡茨(资料图)据以色列方面29日消息,以国防部长卡茨当天表示,鉴于复杂的安全局势和在黎巴嫩的军事行...