android 下载文件

今天简单说下  android 中io 操作,从网络上下载文件如:视频,音乐。

主要用到java 中的httpurlconnection 这个类,这个封装了socket 通信的细节。

说下原理:就是本地的client 和远程的服务器建立一个socket 连接然后通过io 流 将服务器的数据写到本地去 。

网络的操作的都是这个原理,不管你下载图片,json ,xml,或者视频,音乐,等文件。

package com.example;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * @author cyl
 * @email [email protected]
 * @date
 */
public class Downfile {
    public static void main(String[] args){
        downFile("","");
    }

    /**
     * 从网络上下载文件
     * @param fileUrl  url 地址
     * @param target   文件需要存放的位置
     */
    public static void downFile(String fileUrl,String target){
        try {
            //运用代理
//            Proxy proxy = new Proxy(Proxy.Type.HTTP,new InetSocketAddress("--",80));
            //建立远程的连接
            HttpURLConnection urlConnection = (HttpURLConnection) new URL(fileUrl).openConnection();
            //connection  可以设置  一些列属性 例如需要添加的header 属性  设置超时  获取的流操作  等等  当然 这一切的一切都可以使用默认值
            //获取远程服务器返回响应码  比如以下常用的 响应码 200 就是响应 ok  我们可以进行读写数据了  还有404 500 206  等响应码 具体的意思 可以参考 http 响应码
            int code = urlConnection.getResponseCode();
            if(code == 200){
                //连接从得到一个输入流   这是io 的中基础流   还有 outputstream  当然还有很多装饰流 缓冲流  字节流 字符流 桥梁流 等  具体含义 有兴趣可以查阅
                InputStream is = urlConnection.getInputStream();
                //从流中读取的缓冲块  就是定义一个一次读取的小   如果总是一次读取一个字节  那效率 肯定很差 ,  感兴趣自己可以试试 看效果
                byte data[] = new byte[1024*1024*4];
                //打开一个输入流  可以往文件中写数据
                FileOutputStream os = new FileOutputStream(target);
                //一次读取长度
                int ln = -1;
                //反复的从 io 流中读取数据  直到没有数据 就会返回一个 -1
                while((ln = is.read(data))!=-1){
                    //定义了一个一次读取的大小 但是实际情况不一定一次读了那么多数据  应该以实际读到的内容为准  也就是以 这个数据的实际长度为准
                    //ln 就是实际读取到的长度
                    os.write(data,0,ln);
                    //这个最好每次刷新 一次 文件的大小才会发生变化  就是把每次循环的得到的数据实际刷新到本地的文件中
                    os.flush();
                }
                //输入输出流关闭   可以  降低资源的消耗 因为我们已经完成了操作  可以 关闭了
                is.close();
                os.close();
                System.out.println("down finished");
            }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
整个流程注释已经很详细了。。。有疑问的请留言。。。

猜你喜欢

转载自blog.csdn.net/tiandiyinghun/article/details/50978417
今日推荐