• 转 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
  • 相关阅读:
    composer安装Workerman报错:Installation failed, reverting ./composer.json to its original content.
    从零开始搭建linux下laravel 5.5所需环境(三)
    ASPNET Razor 使用 @Ajax.BeginForm 需要注意到的细节
    .NET跨平台
    1172金币
    1044电子表
    1358统计号码牌
    1355疫情防控 数据调查
    1056反向输出一个三位数2
    1071行李托运
  • 原文地址:https://www.cnblogs.com/CaptainLin/p/3557021.html
Copyright © 2020-2023  润新知