Android:文件下载和写入SD卡学习小结

一、文件下载 

       Android开发中,有时需要从网上下载一些资源以供用户使用,Android API中已经提供了很多直接可以用的类供大家使用,一般文件下载需要通过三个步骤:

       1.创建一个HttpURLConnection对象:

[java] view plain copy
  1. // 创建一个URL对象,urlStr指的是网络IP地址 
  2. url = new URL(urlStr); 
  3. // 创建一个HttpURLConnection连接 
  4. HttpURLConnection urlConn = (HttpURLConnection) url.openConnection(); 
       2.获得一个InputStream对象: 
[java] view plain copy
  1. InputStream input=null
  2. input=urlConn.getInputStream(); 
       3.设置访问网络的权限: 
[java] view plain copy
  1. //在AndroidManifest.xml配置文件中加入权限信息 
  2. <uses-permission android:name="android.permission.INTERNET"/> 

二、访问并写入SD卡

      由于手机内存有限,所以一般需要将资料放入大容量容器SD卡中,不同手机SD卡所在目录不一样,这就需要咱们通过一个统一的函数找到SD卡所在的目录,再对它进行操作,Android中提供了一个函数,可以查找到基本上所有类型型号的手机SD卡所在的目录:

[java] view plain copy
  1. //得到当前设备SD卡的目录 
  2. Environment.getExternalStorageDirectory(); 

      在访问SD卡前还必须在配置文件中设置权限,这样才可以最SD卡进行存取操作:

[java] view plain copy
  1. //在AndroidManifest.xml配置文件中加入权限信息 
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
      以下是一个对SD操作经常用到的类,以后如果需要对SD卡操作,直接可以拿过来用: 
[java] view plain copy
  1. public class FileUtils { 
  2.  
  3.     private String SDPATH; 
  4.  
  5.     public String getSDPATH() { 
  6.         return SDPATH; 
  7.     } 
  8.     public FileUtils() { 
  9.         //得到当前外部存储设备的目录 
  10.         // /SDCARD 
  11.         SDPATH = Environment.getExternalStorageDirectory() + "/"
  12.     } 
  13.     /**
  14.      * 在SD卡上创建文件
  15.      *
  16.      * @throws IOException
  17.      */ 
  18.     public File creatSDFile(String fileName) throws IOException { 
  19.         File file = new File(SDPATH + fileName); 
  20.         file.createNewFile(); 
  21.         return file; 
  22.     } 
  23.      
  24.     /**
  25.      * 在SD卡上创建目录
  26.      *
  27.      * @param dirName
  28.      */ 
  29.     public File creatSDDir(String dirName) { 
  30.         File dir = new File(SDPATH + dirName); 
  31.         dir.mkdir(); 
  32.         return dir; 
  33.     } 
  34.  
  35.     /**
  36.      * 判断SD卡上的文件夹是否存在
  37.      */ 
  38.     public boolean isFileExist(String fileName){ 
  39.         File file = new File(SDPATH + fileName); 
  40.         return file.exists(); 
  41.     } 
  42.      
  43.     /**
  44.      * 将一个InputStream里面的数据写入到SD卡中
  45.      */ 
  46.     public File write2SDFromInput(String path,String fileName,InputStream input){ 
  47.         File file = null
  48.         OutputStream output = null
  49.         try
  50.             creatSDDir(path); 
  51.             file = creatSDFile(path + fileName); 
  52.             output = new FileOutputStream(file); 
  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 file; 
  71.     } 


三、实例演示

      在对以上文件下载和SD卡访问基本知识了解的基础上,下面进行举例说明:

      文件下载一般有文本文件和字节文件,不同文件下载的方式不同,但是都需要通过上面所说的一般步骤,即都需要首先得到一个InputStream对象,然 后在对这个对象进行不同的操作,以下是对一个图片文件(字节文件)进行处理,我们在以上FileUtils类的基础上创建一个 HttpDownLoader类,以供文件下载时作为工具类调用:

[java] view plain copy
  1. public class HttpDownloader { 
  2.     private URL url=null
  3.     FileUtils fileUtils=new FileUtils(); 
  4.     public int downfile(String urlStr,String path,String fileName) 
  5.     { 
  6.         if(fileUtils.isFileExist(path+fileName)) 
  7.             {return 1;} 
  8.         else
  9.          
  10.         try
  11.             InputStream input=null
  12.             input = getInputStream(urlStr); 
  13.             File resultFile=fileUtils.write2SDFromInput(path, fileName, input); 
  14.             if(resultFile==null
  15.             { 
  16.                 return -1
  17.             } 
  18.         } catch (IOException e) { 
  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 IOException 
  28.        {      
  29.            InputStream is=null
  30.             try
  31.                 url=new URL(urlStr); 
  32.                 HttpURLConnection urlConn=(HttpURLConnection)url.openConnection(); 
  33.                 is=urlConn.getInputStream(); 
  34.                  
  35.             } catch (MalformedURLException e) { 
  36.                 // TODO Auto-generated catch block 
  37.                 e.printStackTrace(); 
  38.             } 
  39.              
  40.             return is; 
  41.        } 

    下面编写Activity文件进行文件的操作: 
[java] view plain copy
  1. public class MainActivity extends Activity { 
  2.  
  3.     private Button downfile=null
  4.     @Override 
  5.     public void onCreate(Bundle savedInstanceState) { 
  6.         super.onCreate(savedInstanceState); 
  7.         setContentView(R.layout.activity_main); 
  8.         downfile=(Button)findViewById(R.id.downfile); 
  9.         downfile.setOnClickListener(new View.OnClickListener() { 
  10.         downfile.setOnClickListener(new View.OnClickListener() { 
  11.              
  12.             @Override 
  13.             public void onClick(View v) { 
  14.                 // TODO Auto-generated method stub 
  15.                 HttpDownloader httpDownLoader=new HttpDownloader(); 
  16.                   int result=httpDownLoader.downfile("http://219.216.197.96:8080/test//file.jpg", "test/", "test.jpg"); 
  17.                   if(result==0
  18.                   { 
  19.                       Toast.makeText(MainActivity.this, "下载成功!", Toast.LENGTH_SHORT).show(); 
  20.                   } 
  21.                   else if(result==1) { 
  22.                       Toast.makeText(MainActivity.this, "已有文件!", Toast.LENGTH_SHORT).show(); 
  23.                 } 
  24.                   else if(result==-1){ 
  25.                       Toast.makeText(MainActivity.this, "下载失败!", Toast.LENGTH_SHORT).show(); 
  26.                   }  
  27.             } 
  28.         }); 
  29.     } 
  30.  
  31.     @Override 
  32.     public boolean onCreateOptionsMenu(Menu menu) { 
  33.         getMenuInflater().inflate(R.menu.activity_main, menu); 
  34.         return true
  35.     } 
注:在编写文件下载的IP地址时,不要用本地地址,比如:127.0.0.1,由于我在测试时用的Tomcat服务器,IP就直接用的本地地址,程序运行后一直没有报错,但是去SD卡中找文件时一直没有找到文件,最后改为电脑的IP地址后问题解决了。

        上例中首先定义了一个HttpDownLoader类的对象httpdownloader,再调用该对象的downfile()方法,方法中第一个参数指的是文件下载的URL,第二个参数指的是准备存放到SD卡中的目录,第三个参数指的是文件存放的名称。

你可能感兴趣的:(Android:文件下载和写入SD卡学习小结)