Android 文件下载三种基本方式

作者:小小情意 时间:2023-02-26 08:21:48 

一、自己封装URLConnection 连接请求类


public void downloadFile1() {
 try{
   //下载路径,如果路径无效了,可换成你的下载路径
   String url = "http://c.qijingonline.com/test.mkv";
   String path = Environment.getExternalStorageDirectory().getAbsolutePath();

final long startTime = System.currentTimeMillis();
   Log.i("DOWNLOAD","startTime="+startTime);
   //下载函数
   String filename=url.substring(url.lastIndexOf("/") + 1);
   //获取文件名
   URL myURL = new URL(url);
   URLConnection conn = myURL.openConnection();
   conn.connect();
   InputStream is = conn.getInputStream();
   int fileSize = conn.getContentLength();//根据响应获取文件大小
   if (fileSize <= 0) throw new RuntimeException("无法获知文件大小 ");
   if (is == null) throw new RuntimeException("stream is null");
   File file1 = new File(path);
   if(!file1.exists()){
     file1.mkdirs();
   }
   //把数据存入路径+文件名
   FileOutputStream fos = new FileOutputStream(path+"/"+filename);
   byte buf[] = new byte[1024];
   int downLoadFileSize = 0;
   do{
     //循环读取
     int numread = is.read(buf);
     if (numread == -1)
     {
       break;
     }
     fos.write(buf, 0, numread);
     downLoadFileSize += numread;
     //更新进度条
   } while (true);
   Log.i("DOWNLOAD","download success");
   Log.i("DOWNLOAD","totalTime="+ (System.currentTimeMillis() - startTime));
   is.close();
 } catch (Exception ex) {
   Log.e("DOWNLOAD", "error: " + ex.getMessage(), ex);
 }
}

这种方式在Android 刚兴起的时候,很少下载封装框架,就自己封装了。虽然一般的文件都能下载,但这种方式缺点很多,不稳定或者各种各样的问题会出现。 

二、Android自定的下载管理(会在notification 显示下载的进度,同时可以暂停、重新连接等)


private void downloadFile2(){
 //下载路径,如果路径无效了,可换成你的下载路径
 String url = "http://c.qijingonline.com/test.mkv";
 //创建下载任务,downloadUrl就是下载链接
 DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
 //指定下载路径和下载文件名
 request.setDestinationInExternalPublicDir("", url.substring(url.lastIndexOf("/") + 1));
 //获取下载管理器
 DownloadManager downloadManager= (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
 //将下载任务加入下载队列,否则不会进行下载
 downloadManager.enqueue(request);
}

 这种方式其实就是交给了Android系统的另一个app去下载管理。这样的好处不会消耗该APP的 CPU资源。缺点是:控制起来很不灵活。

三、使用第三方 okhttp 网络请求框架


private void downloadFile3(){
 //下载路径,如果路径无效了,可换成你的下载路径
 final String url = "http://c.qijingonline.com/test.mkv";
 final long startTime = System.currentTimeMillis();
 Log.i("DOWNLOAD","startTime="+startTime);
 Request request = new Request.Builder().url(url).build();
 new OkHttpClient().newCall(request).enqueue(new Callback() {
   @Override
   public void onFailure(Call call, IOException e) {
     // 下载失败
     e.printStackTrace();
     Log.i("DOWNLOAD","download failed");
   }
   @Override
   public void onResponse(Call call, Response response) throws IOException {
     Sink sink = null;
     BufferedSink bufferedSink = null;
     try {
       String mSDCardPath= Environment.getExternalStorageDirectory().getAbsolutePath();
       File dest = new File(mSDCardPath,  url.substring(url.lastIndexOf("/") + 1));
       sink = Okio.sink(dest);
       bufferedSink = Okio.buffer(sink);
       bufferedSink.writeAll(response.body().source());
       bufferedSink.close();
       Log.i("DOWNLOAD","download success");
       Log.i("DOWNLOAD","totalTime="+ (System.currentTimeMillis() - startTime));
     } catch (Exception e) {
       e.printStackTrace();
       Log.i("DOWNLOAD","download failed");
     } finally {
       if(bufferedSink != null){
         bufferedSink.close();
       }
     }
   }
 });
}

okhttp是一个很有名气的开源框架,目前已经很多大公司都直接使用它作为网络请求库(七牛云SDK, 阿里云SDK)。 且里面集成了很多优势,包括 okio (一个I/O框架,优化内存与CPU)。

以上所述是小编给大家介绍的Android 文件下载三种基本方式网站的支持!

来源:http://www.cnblogs.com/xiaoxiaoqingyi/archive/2017/06/13/7003241.html

标签:android,文件下载
0
投稿

猜你喜欢

  • C#中Equals和GetHashCode使用及区别

    2023-12-10 14:47:27
  • 如何用120行Java代码写一个自己的区块链

    2023-07-17 03:44:33
  • 学习JVM之java内存区域与异常

    2022-07-09 09:59:41
  • Android 设置颜色的方法总结

    2023-12-14 16:41:57
  • 深入HRESULT与Windows Error Codes的区别详解

    2023-10-16 15:19:42
  • java 验证用户是否已经登录与实现自动登录方法详解

    2021-10-21 13:49:50
  • Java:泛型知识知多少

    2023-11-24 23:08:44
  • C#实现在图像中绘制文字图形的方法

    2023-03-20 17:06:11
  • Java的字符串中对子字符串的查找方法总结

    2022-12-16 17:16:31
  • 浅析SpringBoot2底层注解@Conditional@ImportResource

    2023-08-01 23:35:51
  • C#实现12306自动登录的方法

    2023-11-07 13:20:27
  • c#使用xamarin编写拨打电话程序

    2023-09-04 18:09:20
  • Spring Security短信验证码实现详解

    2023-07-04 22:27:07
  • Android ListView适配器(Adapter)优化方法详解

    2023-08-09 21:44:32
  • Android百度地图应用之MapFragment的使用

    2022-07-07 21:16:37
  • SpringMVC中的几个模型对象

    2021-09-01 19:25:44
  • 详解Flutter中key的正确使用方式

    2021-11-05 04:31:02
  • 详解Jvm中时区设置方式

    2023-12-09 02:59:19
  • java反射之方法反射的基本操作方法

    2021-11-26 00:45:36
  • java9开始——接口中可以定义private私有方法

    2023-03-27 06:53:15
  • asp之家 软件编程 m.aspxhome.com