说明:

01:使用okhttp下载文件(NIO)
02:传统的URLConnection下载文件
03:说明下okhttp
04:个人见解(Java):在文件下载,和登录用到okhttp较多。在Android使用:小编是个小白


1 使用okhttp下载文件:

  1. 引入okhttp3的依赖
<!--okhttp--><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.14.9</version></dependency>
  1. 封装下okhttp
import coms.common.http.RetryIntercepter;
import coms.common.sys.Usual;
import okhttp3.*;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/*** HttpUtil封装,异步连接池模式*/
public class HttpUtil {/*** Http连接超时时间*/private static final int minCONNECT_TIMEOUT = 3000;/*** Http 写入超时时间*/private static final int minWRITE_TIMEOUT = 3000;/*** Http Read超时时间*/private static final int minREAD_TIMEOUT = 3000;/*** Http Async Call Timeout*/private static final int minCall_TIMEOUT = 3000;/*** Http连接池*/private static final int connectionPoolSize = 1000;
//    /**
//     * 静态Http请求池
//     */
//    private static OkHttpClient client=null;/*** 静态连接池对象*/private static ConnectionPool mConnectionPool=new ConnectionPool(connectionPoolSize, 30, TimeUnit.MINUTES);//executor = new ThreadPoolExecutor(0, 2147483647, ...这个是静态的,21亿连接数量
//    private static RealConnectionPool mConnectionPool=new RealConnectionPool(connectionPoolSize, 30, TimeUnit.MINUTES);/*** ContentType*/private static final String ContentType="application/json;charset=utf-8";/*** AcceptType*/private static final String AcceptType="application/json;charset=utf-8";/*** Content-Type*/private static final MediaType MediaType_ContentType = MediaType.parse(ContentType);/*** 获取Http Client对象* 降低连接时间* @return*/public static OkHttpClient getHttpClient(){OkHttpClient client = new OkHttpClient.Builder()
//                .addInterceptor(new RetryIntercepter(3))//重试3次
//                .addInterceptor(new GzipRequestInterceptor())//gzip压缩.connectTimeout(minCONNECT_TIMEOUT, TimeUnit.MILLISECONDS) //连接超时.readTimeout(minREAD_TIMEOUT, TimeUnit.MILLISECONDS) //读取超时.writeTimeout(minWRITE_TIMEOUT, TimeUnit.MILLISECONDS) //写超时.callTimeout(minCall_TIMEOUT, TimeUnit.MILLISECONDS)// okhttp默认使用的RealConnectionPool初始化线程数==2147483647,在服务端会导致大量线程TIMED_WAITING//ThreadPoolExecutor(0, 2147483647, 60L, TimeUnit.SECONDS, new SynchronousQueue(), Util.threadFactory("OkHttp ConnectionPool", true));.connectionPool(mConnectionPool).build();return client;}
  1. 使用okhttp下载百度logo
//import java.nio.file.*;public static void main(String[] args) {//百度的LogoString imgUrl = "https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png";try {OkHttpClient client = HttpUtil.getHttpClient();Request request = new Request.Builder()//访问路径.url(imgUrl).build();Response response = null;response = client.newCall(request).execute();//转化成byte数组byte[] bytes = response.body().bytes();//本地文件夹目录(下载位置)String folder = "D:/q/w/e/r/";//切割出图片名称==》PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.pngString filename = StringUtils.substringAfterLast(imgUrl, "/");Path folderPath = Paths.get(folder);boolean desk = Files.exists(folderPath);if (!desk) {//不存在文件夹 => 创建Files.createDirectories(folderPath);}//完整图片路径==》D:/q/w/e/r/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.pngPath filePath = Paths.get(folder + filename);boolean exists = Files.exists(filePath, LinkOption.NOFOLLOW_LINKS);if (!exists) {//不存在文件 => 创建Files.write(filePath, bytes, StandardOpenOption.CREATE);}} catch (Exception e) {e.printStackTrace();}}
  1. 效果

2 传统的URLConnection下载文件:

  1. demo
 //import java.net.URL;//import java.net.URLConnection;public void download() {String downLoadUrl = "https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png";try {// 构造URLURL url = new URL(downLoadUrl);// 打开连接URLConnection con = url.openConnection();// 输入流InputStream is = con.getInputStream();// 1K的数据缓冲byte[] bs = new byte[1024];// 读取到的数据长度int len;//图片的完整路径String filename = "D:/a/b/1.jpg";// 输出的文件流File file = new File(filename);//是否存在目录isChartPathExist("D:/a/b/");FileOutputStream os = new FileOutputStream(file, true);// 开始读取while ((len = is.read(bs)) != -1) {os.write(bs, 0, len);}// 完毕,关闭所有链接os.close();is.close();} catch (IOException e) {e.printStackTrace();}}//java判断指定路径文件夹是否存在,若不存在则创建新的文件夹private static void isChartPathExist(String dirPath) {File file = new File(dirPath);if (!file.exists()) {file.mkdirs();}}
  1. 效果

3 okhttp简介:

1. 说明:

HTTP是现代应用常用的一种交换数据和媒体的网络方式,高效地使用HTTP能让资源加载更快,节省带宽。OkHttp是一个高效的HTTP客户端,它有以下默认特性:

  • 支持HTTP/2,允许所有同一个主机地址的请求共享同一个socket连接
  • 连接池减少请求延时
  • 透明的GZIP压缩减少响应数据的大小
  • 缓存响应内容,避免一些完全重复的请求

2. 使用okhttp来访问请求(GET),是使用 .string()

 //例如:OkHttpClient client = HttpUtil.getHttpClient();Request request = new Request.Builder().addHeader("访求球头").url("访问地址").build();//默认get方法Response response = client.newCall(request).execute();result = response.body().string();//输出json(string)

3. okhttp的其他基本使用-demo

01、同步get请求

  /*** 同步get请求*///import org.junit.jupiter.api.Test;@Testpublic void syncGet01() throws IOException {String urlBaidu = "http://www.baidu.com/";OkHttpClient okHttpClient = new OkHttpClient(); // 创建OkHttpClient对象Request request = new Request.Builder().url(urlBaidu).build(); // 创建一个请求Response response = okHttpClient.newCall(request).execute(); // 返回实体if (response.isSuccessful()) { // 判断是否成功/*** 获取返回的数据,可通过response.body().string()获取,默认返回的是utf-8格式;* string()适用于获取小数据信息,如果返回的数据超过1M,建议使用stream()获取返回的数据,* 因为string() 方法会将整个文档加载到内存中*/System.out.println(response.body().string()); // 打印数据} else {System.out.println("失败"); // 链接失败}}

02、亦步get请求

  /*** 异步Get请求*/@Testpublic void asyncGet02() {String urlBaidu = "http://www.baidu.com/";// 创建OkHttpClient对象OkHttpClient okHttpClient = new OkHttpClient();// 创建一个请求Request request = new Request.Builder().url(urlBaidu).build();// 回调okHttpClient.newCall(request).enqueue(new Callback() {public void onResponse(Call call, Response response)  {// 请求成功调用,该回调在子线程try {System.out.println("ok");String result = response.body().string();System.out.println(result);} catch (IOException e) {e.printStackTrace();}}public void onFailure(Call call, IOException e) {// 请求失败调用System.out.println(e.getMessage());}});//测试时候,保证主线程活着。Thread.sleep(1000000);}

03、post提交表单数据

/*** Post提交表单*/public  void asyncPost_Form() {//表单参数String name = "";//访问地址String url = "";// OkHttpClient对象OkHttpClient okHttpClient = new OkHttpClient();//设置数据RequestBody formBody = new FormBody.Builder()//表单键值对.add("name", name).build();// post请求Request request = new Request.Builder().url(url).post(formBody).build();// 回调okHttpClient.newCall(request).enqueue(new Callback() {public void onResponse(Call call, Response response) throws IOException {//成功后的回调System.out.println(response.body().string());}public void onFailure(Call call, IOException e) {//失败后的回调System.out.println(e.getMessage());}});}

04、post提交字符串

 /*** Post提交字符串*/@Testpublic  void post_StringParam(){MediaType MEDIA_TYPE = MediaType.parse("text/text; charset=utf-8");// 请求链接String url = "";// OkHttpClient对象OkHttpClient okHttpClient = new OkHttpClient();String string = "name=zhangsan"; // 要发送的字符串/*** RequestBody.create(MEDIA_TYPE, string)* 第二个参数可以分别为:byte[],byteString,File,String。*/Request request = new Request.Builder()//地址.url(url)//参数.post(RequestBody.create(MEDIA_TYPE,string)).build();okHttpClient.newCall(request).enqueue(new Callback() {//成功public void onResponse(Call call, Response response) throws IOException {System.out.println(response.body().string());//这里可以把string转成json//jackson,gson.../*** 步骤* 创建一个字段对应的实体类Vo* gson的方式-> gson.fromJson(response.body().string(), 实体类.class)*/}//失败public void onFailure(Call call, IOException e) {System.out.println(e.getMessage());}});}

最后在附上一个示例

 /*** 使用用例* @param args*/public static void main(String[] args) throws InterruptedException {//测试地址String mUrl="";//测试数据//TODO: 建议byte[]直接传输,避免Base64数据长度及Chartset编码问题byte[] mData=new byte[0];String mDataStr="测试是大法师大法是";mData=Usual.toBytes(mDataStr);//getHttpClient()是文章开头封装那个okhttp的方法OkHttpClient client = getHttpClient();//可以为空RequestBody body = RequestBody.create(null, mData);//在Request中统一设置Header//如果Request的header中用户加了header("Accept-Encoding")的话,那么Okhttp不会帮你处理Gzip的解压,需要你自己去处理Request request = new Request.Builder().addHeader("Content-Type",ContentType).addHeader("Accept",AcceptType)
//                .addHeader("Accept-Encoding", "gzip").addHeader("Connection","keep-alive").cacheControl(new CacheControl.Builder().noCache().build())     //不做缓存.url(mUrl).post(body)                                                     //这里指定了POST.build();Call call = client.newCall(request);//这里定义异步返回后,同步参数//TODO: 建议模式 A->自己->C,并顺序返回情况
//        //同步调用
//        try{//            Response response = call.execute();
//        }catch(IOException exp){//
//        }
//        finally{//
//        }//TODO: 建议模式 自己->[C,并返回情况A]->自己->C并返回自己;//TODO: Android不受该影响//异步回调Lock cht_stLock = new ReentrantLock();final TestBean mBean=new TestBean();call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {//                log.error(e.getMessage());}@Overridepublic void onResponse(Call call, Response response) throws IOException {//TODO: 建议byte[]直接回传,避免Base64数据长度及Chartset编码问题//Stream处理用例,使用pipe管道
//                mReturnData=Streams.readAll(response.body().byteStream());//默认编码处理用例
//                String result = response.body().string();
//                log.info(result);byte[] mReturnData=new byte[0];//byte[]处理用例mReturnData=response.body().bytes();if(Usual.isNullOrZeroBytes(mReturnData)==false){String result =Usual.fromBytes(mReturnData);}mBean.setByteData(mReturnData);//最后再设置curStatecht_stLock.lock();try{mBean.setCurState(true);}finally{cht_stLock.unlock();}}});//TODO: A->自己->C,并顺序返回情况,使用final TestBean方式//阻塞进行等待while(mBean.getCurState()!=true){Thread.sleep(30);}//返回后,可以同步返回,其他调用的Http}
//=================================================================================//实体类public class TestBean {private String strData;private byte[] byteData;private Boolean curState;//省略get/set。。。
}

完结

使用okhttp下载文件 、传统方式下载文件,简介okhttp使用(Java)相关推荐

  1. AIR文件上传与文件断点续传方式下载

    <?xml version="1.0" encoding="utf-8"?> <s:WindowedApplication xmlns:fx= ...

  2. linux 自启动 快捷键,linux自定义快捷键、文件打开方式、文件快捷方式、启动器及开机启动...

    http://blog.csdn.net/pipisorry/article/details/39584173 linux自定义快捷键 lz的: shutter-s shutter -s gnome- ...

  3. jnlp文件打开方式(jnlp文件打开方式Java)

    jnlp这个文件打开方式不小心改成网页打开了怎么也回不?inpu 你这个文件的扩展名不对啊!扩展名只有3位,你怎么跑出来4位了,是jnp还是什么,从这个文件上,点鼠标右键,有个打开方式,选一个你想打开 ...

  4. python小课文件_Python--小甲鱼学习笔记--第28课:文件(文件打开方式、文件对象方法)...

    1.open()函数定义:open(file, mode='r',buffering=1,encoding=None, errors=None, newline=None, closefd=True, ...

  5. matlab 文件打开方式,mex文件和mat文件打开方式

    MAT文件是MATLAB专用的用于保存数据至磁盘和向MATLAB导入.从MATLAB导出数据的数据文件格式.MAT文件提供了一种简便的机制,它允许你在两个平台之间以灵活的方式移动数据.而且,它还提供了 ...

  6. oracle文件存储方式,oracle文件存储介质介绍

    oracle文件存储介质介绍 1. 前言 现在我们用户中随着ORACLE的应用越来越复杂,对于ORACLE文件存储也再不象以前这么简单D盘,C盘的规划,特别是linux环境加上RAC的应用对存储介质有 ...

  7. Postman:测试下载文件时默认打开文件改为弹出下载框

    问题 在Postman工具测试下载文件的功能时默认是将文件用文本方式打开,而我们需要的是弹出下载框的方式下载文件.此时需要做一下变动. 解决方案 点击send的按钮旁边的箭头,选择 send and ...

  8. F2FS源码分析-2.1 [F2FS 读写部分] F2FS文件数据组织方式以及物理地址的映射

    F2FS源码分析系列文章 主目录 一.文件系统布局以及元数据结构 二.文件数据的存储以及读写 F2FS文件数据组织方式 一般文件写流程 一般文件读流程 目录文件读流程(未完成) 目录文件写流程(未完成 ...

  9. Windows技巧:右键文件打开方式,该文件没有与之关联来执行该操作

    Windows技巧:右键文件打开方式,该文件没有与之关联来执行该操作 正文 参考链接 正文 报错如下: 搜索关键词: 文件打开方式 该文件没有与之关联来执行该操作 原因: 右键选择默认文件打开方式相关 ...

  10. web项目图片/文件保存方式

    web项目图片/文件保存方式 其实文件和图片都是二进制流文件 以下统称图片 1直接把图片存到数据库字段中 2图片存项目/public/img目录,文件名存数据库字段 3规范的使用阿里云oss/腾讯云c ...

最新文章

  1. GreenDao 3.x 注解中ToOne和ToMany的个人理解
  2. MySQL笔记5:如何创建和删除索引?
  3. STM32 RTC BKP备份数据区数据丢失问题的讨论
  4. java.util.List学习笔记
  5. TensorFlow 2.0 - CNN / 预训练 / RNN
  6. python怎么调用navicat_三十七、python操作mysql,和navicat
  7. 如何在CentOS 7中配置静态IP地址
  8. Liquid基础语法
  9. VC 在对话框中增加菜单栏
  10. ManicTime 十分有意思的个人时间分析与跟踪工具,把您丢失的时间找回来吧!
  11. Maven的安装和使用
  12. 神经网络测试集loss不变_神经网络训练过程中不收敛或者训练失败的原因
  13. javase二维数组笔记
  14. 寻找阿姆斯特朗数(北理乐学)
  15. java万能万年历的程序_Java编写多功能万年历程序的实例分享
  16. Fastdb安装与使用
  17. 计算机01无法纯随机,玄不救非,氪不改命 如何分清游戏中的“真随机”和“伪随机”?...
  18. win10一按右键就闪屏_六种方法教你如何解决win10笔记本屏幕闪烁问题?
  19. Pandas数据显示不全?快来了解这些设置技巧! ⛵
  20. iptables 学习笔记 (下)

热门文章

  1. linux网络编程--socket服务器和客户端TCP编程及多进程编程
  2. 微信支付商户平台可以绑定多个不同主体的小程序或微信公众号
  3. 五大车载操作(VOS)系统
  4. ug建模教程ug建模怎么学ug10.0编程教程入门ug建模实例
  5. 关于C语言全局变量定义和引用写法总结
  6. 阮一峰 未来世界的幸存者 读书随想1
  7. Matlab之全局变量
  8. 2018年8月12日 今日头条笔试 整理
  9. wps怎么导入access_WPS Access 2013_access 2013下载-下载之家
  10. OA集成新标杆 10oa系统集成能力不容小觑