一、文件下载
Android开发中,有时需要从网上下载一些资源以供用户使用,Android API中已经提供了很多直接可以用的类供大家使用,一般文件下载需要通过三个步骤:
1.创建一个HttpURLConnection对象:
1. // 创建一个URL对象,urlStr指的是网络IP地址
2. url = new
3. // 创建一个HttpURLConnection连接
4. HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
2.获得一个InputStream对象:
1. InputStream input=null;
2. input=urlConn.getInputStream();
3.设置访问网络的权限:
1. //在AndroidManifest.xml配置文件中加入权限信息
2. <uses-permission android:name="android.permission.INTERNET"/>
二、访问并写入SD卡
由于手机内存有限,所以一般需要将资料放入大容量容器SD卡中,不同手机SD卡所在目录不一样,这就需要咱们通过一个统一的函数找到SD卡所在的目录,再对它进行操作,Android中提供了一个函数,可以查找到基本上所有类型型号的手机SD卡所在的目录:
1. //得到当前设备SD卡的目录
2. Environment.getExternalStorageDirectory();
在访问SD卡前还必须在配置文件中设置权限,这样才可以最SD卡进行存取操作:
1. //在AndroidManifest.xml配置文件中加入权限信息
2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
以下是一个对SD操作经常用到的类,以后如果需要对SD卡操作,直接可以拿过来用:
1. public class
2.
3. private
4.
5. public
6. return
7. }
8. public
9. //得到当前外部存储设备的目录
10. // /SDCARD
11. "/";
12. }
13. /**
14. * 在SD卡上创建文件
15. *
16. * @throws IOException
17. */
18. public File creatSDFile(String fileName) throws
19. new
20. file.createNewFile();
21. return
22. }
23.
24. /**
25. * 在SD卡上创建目录
26. *
27. * @param dirName
28. */
29. public
30. new
31. dir.mkdir();
32. return
33. }
34.
35. /**
36. * 判断SD卡上的文件夹是否存在
37. */
38. public boolean
39. new
40. return
41. }
42.
43. /**
44. * 将一个InputStream里面的数据写入到SD卡中
45. */
46. public
47. null;
48. null;
49. try{
50. creatSDDir(path);
51. file = creatSDFile(path + fileName);
52. new
53. byte buffer [] = new byte[4 * 1024];
54. while((input.read(buffer)) != -1){
55. output.write(buffer);
56. }
57. output.flush();
58. }
59. catch(Exception e){
60. e.printStackTrace();
61. }
62. finally{
63. try{
64. output.close();
65. }
66. catch(Exception e){
67. e.printStackTrace();
68. }
69. }
70. return
71. }
72. }
三、实例演示
在对以上文件下载和SD卡访问基本知识了解的基础上,下面进行举例说明:
文件下载一般有文本文件和字节文件,不同文件下载的方式不同,但是都需要通过上面所说的一般步骤,即都需要首先得到一个InputStream对象,然后在对这个对象进行不同的操作,以下是对一个图片文件(字节文件)进行处理,我们在以上FileUtils类的基础上创建一个HttpDownLoader类,以供文件下载时作为工具类调用:
下面编写Activity文件进行文件的操作:
1. public class
2. private URL url=null;
3. new
4. public int
5. {
6. if(fileUtils.isFileExist(path+fileName))
7. return 1;}
8. else{
9.
10. try
11. null;
12. input = getInputStream(urlStr);
13. File resultFile=fileUtils.write2SDFromInput(path, fileName, input);
14. if(resultFile==null)
15. {
16. return -1;
17. }
18. catch
19. // TODO Auto-generated catch block
20. e.printStackTrace();
21. }
22.
23. }
24. return 0;
25. }
26. //由于得到一个InputStream对象是所有文件处理前必须的操作,所以将这个操作封装成了一个方法
27. public InputStream getInputStream(String urlStr) throws
28. {
29. null;
30. try
31. new
32. HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();
33. is=urlConn.getInputStream();
34.
35. catch
36. // TODO Auto-generated catch block
37. e.printStackTrace();
38. }
39.
40. return
41. }
42. }
1. public class MainActivity extends
2.
3. private Button downfile=null;
4. @Override
5. public void
6. super.onCreate(savedInstanceState);
7. setContentView(R.layout.activity_main);
8. downfile=(Button)findViewById(R.id.downfile);
9. new
10. new
11.
12. @Override
13. public void
14. // TODO Auto-generated method stub
15. new
16. int result=httpDownLoader.downfile("http://219.216.197.96:8080/test//file.jpg", "test/", "test.jpg");
17. if(result==0)
18. {
19. this, "下载成功!", Toast.LENGTH_SHORT).show();
20. }
21. else if(result==1) {
22. this, "已有文件!", Toast.LENGTH_SHORT).show();
23. }
24. else if(result==-1){
25. this, "下载失败!", Toast.LENGTH_SHORT).show();
26. }
27. }
28. });
29. }
30.
31. @Override
32. public boolean
33. getMenuInflater().inflate(R.menu.activity_main, menu);
34. return true;
35. }
36. }
注:在编写文件下载的IP地址时,不要用本地地址,比如:127.0.0.1,由于我在测试时用的Tomcat服务器,IP就直接用的本地地址,程序运行后一直没有报错,但是去SD卡中找文件时一直没有找到文件,最后改为电脑的IP地址后问题解决了。
上例中首先定义了一个HttpDownLoader类的对象httpdownloader,再调用该对象的downfile()方法,方法中第一个参数指的是文件下载的URL,第二个参数指的是准备存放到SD卡中的目录,第三个参数指的是文件存放的名称。