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

  转自 http://blog.csdn.net/zzp_403184692/article/details/8160739

 一、文件下载 

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

      1.创建一个HttpURLConnection对象:

  1. // 创建一个URL对象,urlStr指的是网络IP地址  
  2. url = new URL(urlStr);  
  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 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.     }  
  72. }  


三、实例演示

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

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

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


   下面编写Activity文件进行文件的操作:

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

 注:在编写文件下载的IP地址时,不要用本地地址,比如:127.0.0.1,由于我在测试时用的Tomcat服务器,IP就直接用的本地地址,程序运行后一直没有报错,但是去SD卡中找文件时一直没有找到文件,最后改为电脑的IP地址后问题解决了。

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

life is a jounery,yes
原文地址:https://www.cnblogs.com/CaptainLin/p/3557021.html