java通过url读取远程数据并保持到本地的实例代码

 更新时间:2018年07月03日 10:21:26   作者:狐狈筱筱生  
本文通过实例代码给大家介绍了java通过url读取远程数据并保持到本地的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

前几天老姐突然告诉我,她在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<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读取远程数据并保持到本地的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Java 详解如何从尾到头打印链表

    Java 详解如何从尾到头打印链表

    在我们平时的代码过程中,链表是我们经常遇到的一个数据结构,它非常的简单,但Java并不能直接将一个链表打印出来,通过这篇文章我们来讲解一下这个问题
    2022-01-01
  • 一个MIDP俄罗斯方块游戏的设计和实现

    一个MIDP俄罗斯方块游戏的设计和实现

    一个MIDP俄罗斯方块游戏的设计和实现...
    2006-12-12
  • IDEA 2020 无法启动的解决办法(启动崩盘)附IDEA 2020 新功能

    IDEA 2020 无法启动的解决办法(启动崩盘)附IDEA 2020 新功能

    这篇文章主要介绍了IDEA 2020 无法启动的解决办法(启动崩盘)附IDEA 2020 新功能,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • 详谈Array和ArrayList的区别与联系

    详谈Array和ArrayList的区别与联系

    下面小编就为大家带来一篇详谈Array和ArrayList的区别与联系。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • MyBatis_Generator插件的安装以及简单使用方法(图解)

    MyBatis_Generator插件的安装以及简单使用方法(图解)

    下面小编就为大家带来一篇MyBatis_Generator插件的安装以及简单使用方法(图解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Java中Https发送POST请求[亲测可用]

    Java中Https发送POST请求[亲测可用]

    这篇文章主要介绍了Java中Https发送POST请求[亲测可用],本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • Java多线程教程之如何利用Future实现携带结果的任务

    Java多线程教程之如何利用Future实现携带结果的任务

    Callable与Future两功能是Java 5版本中加入的,这篇文章主要给大家介绍了关于Java多线程教程之如何利用Future实现携带结果任务的相关资料,需要的朋友可以参考下
    2021-12-12
  • SpringBoot通过@Value实现给静态变量注入值详解

    SpringBoot通过@Value实现给静态变量注入值详解

    这篇文章主要介绍了springboot如何通过@Value给静态变量注入值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Spring中@Scope注解用法解析

    Spring中@Scope注解用法解析

    这篇文章主要介绍了Spring中@Scope注解用法解析,@Scope注解主要作用是调节Ioc容器中的作用域,在Spring IoC容器中主要有以下五种作用域,需要的朋友可以参考下
    2023-11-11
  • Java并发编程示例(十):线程组

    Java并发编程示例(十):线程组

    这篇文章主要介绍了Java并发编程示例(十):线程组,Java提供了ThreadGroup类来控制一个线程组,一个线程组可以通过线程对象来创建,也可以由其他线程组来创建,生成一个树形结构的线程,需要的朋友可以参考下
    2014-12-12

最新评论