今天刚刚学习完Android文件下载和写入SD卡的,随即做一个小结,以供以后学习查阅:
一、文件下载
Android开发中,有时需要从网上下载一些资源以供用户使用,Android API中已经提供了很多直接可以用的类供大家使用,一般文件下载需要通过三个步骤:
1.创建一个HttpURLConnection对象:
// 创建一个URL对象,urlStr指的是网络IP地址 url = new URL(urlStr); // 创建一个HttpURLConnection连接 HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();2.获得一个InputStream对象:
InputStream input=null; input=urlConn.getInputStream();3.设置访问网络的权限:
//在AndroidManifest.xml配置文件中加入权限信息 <uses-permission android:name="android.permission.INTERNET"/>
二、访问并写入SD卡
由于手机内存有限,所以一般需要将资料放入大容量容器SD卡中,不同手机SD卡所在目录不一样,这就需要咱们通过一个统一的函数找到SD卡所在的目录,再对它进行操作,Android中提供了一个函数,可以查找到基本上所有类型型号的手机SD卡所在的目录:
//得到当前设备SD卡的目录 Environment.getExternalStorageDirectory();
在访问SD卡前还必须在配置文件中设置权限,这样才可以最SD卡进行存取操作:
//在AndroidManifest.xml配置文件中加入权限信息 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>以下是一个对SD操作经常用到的类,以后如果需要对SD卡操作,直接可以拿过来用:
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类,以供文件下载时作为工具类调用:
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; } }
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卡中的目录,第三个参数指的是文件存放的名称。