今天简单说下 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 670654904@qq.com
* @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();
}
}
}
整个流程注释已经很详细了。。。有疑问的请留言。。。