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

1、文件下载 

       Android开发中,有时须要从网上下载一些资源以供用户使用,Android API中已经提供了不少直接能够用的类供你们使用,通常文件下载须要经过三个步骤: java

       1.建立一个HttpURLConnection对象: android

[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"/> 

2、访问并写入SD卡 服务器

      因为手机内存有限,因此通常须要将资料放入大容量容器SD卡中,不一样手机SD卡所在目录不同,这就须要我们经过一个统一的函数找到SD卡所在的目录,再对它进行操做,Android中提供了一个函数,能够查找到基本上全部类型型号的手机SD卡所在的目录: 网络

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

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

[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.     } 


3、实例演示 函数

      在对以上文件下载和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卡中的目录,第三个参数指的是文件存放的名称。 this

相关文章
相关标签/搜索