您的位置:首页 > 移动开发 > Android开发

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

2014-09-02 09:12 417 查看
http://blog.csdn.net/zzp_403184692/article/details/8160739

 一、文件下载 

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

      1.创建一个HttpURLConnection对象:

[java] view
plaincopy

// 创建一个URL对象,urlStr指的是网络IP地址  

url = new URL(urlStr);  

// 创建一个HttpURLConnection连接  

HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();  

      2.获得一个InputStream对象:

[java] view
plaincopy

InputStream input=null;  

input=urlConn.getInputStream();  

      3.设置访问网络的权限:

[java] view
plaincopy

//在AndroidManifest.xml配置文件中加入权限信息  

<uses-permission android:name="android.permission.INTERNET"/>  

二、访问并写入SD卡

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

[java] view
plaincopy

//得到当前设备SD卡的目录  

Environment.getExternalStorageDirectory();  

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

[java] view
plaincopy

//在AndroidManifest.xml配置文件中加入权限信息  

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>  

     以下是一个对SD操作经常用到的类,以后如果需要对SD卡操作,直接可以拿过来用:

[java] view
plaincopy

public class FileUtils {  

  

    private String SDPATH;  

  

    public String getSDPATH() {  

        return SDPATH;  

    }  

    public FileUtils() {  

        //得到当前外部存储设备的目录  

        // /SDCARD  

        SDPATH = Environment.getExternalStorageDirectory() + "/";  

    }  

    /** 

     * 在SD卡上创建文件 

     *  

     * @throws IOException 

     */  

    public File creatSDFile(String fileName) throws IOException {  

        File file = new File(SDPATH + fileName);  

        file.createNewFile();  

        return file;  

    }  

      

    /** 

     * 在SD卡上创建目录 

     *  

     * @param dirName 

     */  

    public File creatSDDir(String dirName) {  

        File dir = new File(SDPATH + dirName);  

        dir.mkdir();  

        return dir;  

    }  

  

    /** 

     * 判断SD卡上的文件夹是否存在 

     */  

    public boolean isFileExist(String fileName){  

        File file = new File(SDPATH + fileName);  

        return file.exists();  

    }  

      

    /** 

     * 将一个InputStream里面的数据写入到SD卡中 

     */  

    public File write2SDFromInput(String path,String fileName,InputStream input){  

        File file = null;  

        OutputStream output = null;  

        try{  

            creatSDDir(path);  

            file = creatSDFile(path + fileName);  

            output = new FileOutputStream(file);  

            byte buffer [] = new byte[4 * 1024];  

            while((input.read(buffer)) != -1){  

                output.write(buffer);  

            }  

            output.flush();  

        }  

        catch(Exception e){  

            e.printStackTrace();  

        }  

        finally{  

            try{  

                output.close();  

            }  

            catch(Exception e){  

                e.printStackTrace();  

            }  

        }  

        return file;  

    }  

}  

三、实例演示

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

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

[java] view
plaincopy

public class HttpDownloader {  

    private URL url=null;  

    FileUtils fileUtils=new FileUtils();  

    public int downfile(String urlStr,String path,String fileName)  

    {  

        if(fileUtils.isFileExist(path+fileName))  

            {return 1;}  

        else{  

          

        try {  

            InputStream input=null;  

            input = getInputStream(urlStr);  

            File resultFile=fileUtils.write2SDFromInput(path, fileName, input);  

            if(resultFile==null)  

            {  

                return -1;  

            }  

        } catch (IOException e) {  

            // TODO Auto-generated catch block  

            e.printStackTrace();  

        }  

          

        }  

        return 0;  

    }  

  //由于得到一个InputStream对象是所有文件处理前必须的操作,所以将这个操作封装成了一个方法  

       public InputStream getInputStream(String urlStr) throws IOException  

       {       

           InputStream is=null;  

            try {  

                url=new URL(urlStr);  

                HttpURLConnection urlConn=(HttpURLConnection)url.openConnection();  

                is=urlConn.getInputStream();  

                  

            } catch (MalformedURLException e) {  

                // TODO Auto-generated catch block  

                e.printStackTrace();  

            }  

              

            return is;  

       }  

}  

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

[java] view
plaincopy

public class MainActivity extends Activity {  

  

    private Button downfile=null;  

    @Override  

    public void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.activity_main);  

        downfile=(Button)findViewById(R.id.downfile);  

        downfile.setOnClickListener(new View.OnClickListener() {  

        downfile.setOnClickListener(new View.OnClickListener() {  

              

            @Override  

            public void onClick(View v) {  

                // TODO Auto-generated method stub  

                HttpDownloader httpDownLoader=new HttpDownloader();  

                  int result=httpDownLoader.downfile("http://219.216.197.96:8080/test//file.jpg", "test/", "test.jpg");  

                  if(result==0)  

                  {  

                      Toast.makeText(MainActivity.this, "下载成功!", Toast.LENGTH_SHORT).show();  

                  }  

                  else if(result==1) {  

                      Toast.makeText(MainActivity.this, "已有文件!", Toast.LENGTH_SHORT).show();  

                }  

                  else if(result==-1){  

                      Toast.makeText(MainActivity.this, "下载失败!", Toast.LENGTH_SHORT).show();  

                  }   

            }  

        });  

    }  

  

    @Override  

    public boolean onCreateOptionsMenu(Menu menu) {  

        getMenuInflater().inflate(R.menu.activity_main, menu);  

        return true;  

    }  

}  

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

       上例中首先定义了一个HttpDownLoader类的对象httpdownloader,再调用该对象的downfile()方法,方法中第一个参数指的是文件下载的URL,第二个参数指的是准备存放到SD卡中的目录,第三个参数指的是文件存放的名称。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: