今天下载网络资源的写法。首先,相关的类有:URL,HttpURLConnection
如何获取网络资源的输入流?见代码:
url = new URL(urlStr);
HttpURLConnection urlconn = (HttpURLConnection)url.openConnection();
inputStream = urlconn.getInputStream();
其中urlStr是下载资源的连接,如:http://192.168.2.100:8080/sourse/aa.mp3
这样就能获取输入流,然后写入SD卡,SD卡路径的获取方式:
SDPATH = Environment.getExternalStorageDirectory() + "/";
使用之前,记得加入permission:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
对于如何将InputStream写入SD卡中,我们可以使用java基础的输入输出流
这里给一个简单的方法:
/**
* 将一个InputStream里面的数据写入到SD卡中
* @param path 保存在SD中的路径
* @param fileName 文件名
* @param inputStream 需要写入的数据
* @return 成功写入的文件
*/
public File write2SDFromInput(String path,String fileName,InputStream inputStream) {
File file = null;
OutputStream outputStream = null;
try {
createSDDir(path);
file = createSDFile(path + fileName);
outputStream = new FileOutputStream(file);
byte buffer[] = new byte[4*1024];
int downLoadFilePosition = 0; //用于标记进度条
int numread;
while ((numread = inputStream.read(buffer))!=-1) {
outputStream.write(buffer,0,numread);
downLoadFilePosition += numread;
}
outputStream.flush();
}catch (Exception e) {
e.printStackTrace();
}finally {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return file;
}
代码中的downLoadFilePosition是用于标记下载进度的,不过在此之前,需要获取文件的大小(充当分母)。
如何弄个下载进度,请结合之前讲得Handler一起使用。
ps:在下在写入文件的时候
outputStream.write(buffer,0,numread);
这句话换成
outputStream.write(buffer);
发现是只能写入部分的。查了一下java的api。发现两者的方法区别是:
public void write(byte[] b)
=
public void write(b,0,b.length()也就是两者没有区别,所以,如果读者知道理由,麻烦告知一下,谢谢。
今月今日的学习记录到此结束了,谢谢观看。