今天刚刚学习完Android文件下载和写入SD卡的,以后做一个小结,以供以后学习查阅:

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

// 创建一个URL对象,urlStr指的是网络IP地址 
url = new URL(urlStr); 
// 创建一个HttpURLConnection连接 
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();


      2.获得一个InputStream对象:
[java] 

InputStream input=null; 
input=urlConn.getInputStream();


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

//在AndroidManifest.xml配置文件中加入权限信息 
<uses-permission android:name="android.permission.INTERNET"/>


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

//得到当前设备SD卡的目录 
Environment.getExternalStorageDirectory();


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

//在AndroidManifest.xml配置文件中加入权限信息 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


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

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] 

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] 

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卡中的目录,第三个参数指的是文件存放的名称。