转载时请注明转自:http://blog.csdn.net/sam_zhang1984
交流可加新浪微博:Android开发人
文件下载就涉及到两个问题:
1. 下载 :使用网络协议下载文件,这里主要是讲利用 HTTP 协议下载。
2. 保存 :文件可以保存到手机内存,也可以下载到 SDCard ,下到 SD 卡是比较常用的。
文件下载的主要步骤有:
1) 创建一个 HttpURLConnection 对象。通过 URL 的 openConnection 方法,就可以得到一个 HttpURLConnection 对象,所以要先创建一个 URL 对象;
- //得到一个URL对象
- m_URL = new URL(strURL);
- //由URL对象得到一个HttpURLConnection对象
- urlConn = (HttpURLConnection)m_URL.openConnection();
2) 通过 HttpURLConnection 对象的 getInputStream 方法可以得到一个 InputStream 对象;
- /*由HttpURLConnection对象的方法读出字节流,并转成InputStreamReader,InputStreamReader是字
- * 节流通向字符流的桥梁: 它使用指定的 charset 读取 字节并将其解码为字符;最后再转成BufferedReader
- * 这样就便于一行一行读数据了!
- */
- bufferR = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
3) 获取网络访问的权限。
- <uses-permission android:name="android.permission.INTERNET"/>
文件保存(保存到 SDCard ):
1) 得到设备 SD 卡的目录:使用 Environment.getExternalStorageDirectory 得到 SD 卡的目录;
- //得到当前外部存储设备的目录
- // /SDCARD
- SDPATH = Environment.getExternalStorageDirectory() + "/";
2) 获取访问 SD 卡的权限;
- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
3) 向 SD 卡里写入文件,这里涉及到 JAVA 的文件操作。
向 SD 卡里面写入文件就涉及到了 JAVA 的 IO 操作了,向卡里加入文件主要有以下几个步骤:
a) 创建存放文件的目录;
- public File creatSDDir(String dirName) {
- File dir = new File(SDPATH + dirName);
- dir.mkdir();
- return dir;
- }
b) 在目录中创建文件;
- public File creatSDFile(String fileName) throws IOException {
- File file = new File(SDPATH + fileName);
- file.createNewFile();
- return file;
- }
c) 根据文件对象创建一个 OutPutStream 向文件里写入内容。
- OutputStream output = null;
- InputStream input;
- file = creatSDFile(path + fileName);
- output = new FileOutputStream(file);
- byte buffer [] = new byte[4 * 1024];
- while((input.read(buffer)) != -1){
- output.write(buffer);
- }
JAVA 的 IO 操作各种类的记法:
1、 stream 结尾的是字节流, reader 或 writer 结尾的是字符流;
2、 Buffer 开头的是缓冲处理流;
3、 OutputSteamWriter :即是把一个输出字节流,转换成一个输了字符流。
4、 处理流方法名后面是 stream ,则其参数是 Inputsteam 类型的字节流;如果处理流方法名后面是 reader 或 writer ,则其参数是 reader 或 writer 类型的字符流;
IO流的操作相对比较复杂,方法、类型都比较多,还有得加强基础!
下面是一个好的IO编程习惯:
良好的编程习惯 是先写 flush ,再写 close 。因为 close 直接就把数据流给释放掉,
但如果这时缓冲区里还有数据,就无法再向目标写入了,所以应该先调用 flush 把缓冲区
的所有数据写到目的地。
- try{
- .
- .
- .
- .
- .
- output.flush();
- }
- catch(Exception e){
- e.printStackTrace();
- }
- finally{
- try{
- output.close();
- }
- catch(Exception e){
- e.printStackTrace();
- }
- }