转 Android:文件下载和写入SD卡学习小结
转自 http://blog.csdn.net/zzp_403184692/article/details/8160739
一、文件下载
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;
- }
- }
下面编写Activity文件进行文件的操作:
- 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卡中的目录,第三个参数指的是文件存放的名称。
转 Android:文件下载和写入SD卡学习小结的更多相关文章
- Android 数据库SQLite 写入SD卡
如果手机没有root,数据库文件是无法查看到的,不方便调试. 最好的办法是把数据库写进SD卡. 修改的地方有两处: 1.在你的helper类中把数据库文件名称 DATABASE_NAME 由原来的一个 ...
- Android 下载文件及写入SD卡
Android 下载文件及写入SD卡,实例代码 <?xml version="1.0" encoding="utf-8"?> <LinearL ...
- Android从网络某个地址下载文件、写入SD卡
首先创建一个HttpDownloader类,获取下载文件的网络地址,将文件下载下来以String流的方式返回: public String download(String urlStr){ //url ...
- Android数据存储之SD卡
为了更好的存取应用程序的大文件数据,应用程序需要读. 写SD卡上的文件.SD卡大大扩充手机的存储能力. 操作SD首先要加权限: <!--在SDCard中创建与删除文件权限 --> < ...
- [android] 保存文件到SD卡
/****************2016年5月4日 更新*****************************/ 知乎:为什么很多Android应用要把文件写到/sdcard目录下而不是写到/d ...
- Android中播放本地SD卡中歌曲须要的加入的权限
使用MediaPlayer播放本地Mp3文件时.须要注意的訪问路径的问题以及訪问权限的问题. 1.訪问路径:/storage/emulated/0 此路径即为手机的根路径,能够通过下载ES文件浏览器软 ...
- android 写文件到sd卡问题小记
android 写文件到sd卡问题小记 事情是这样子的.... 这天我开始编写项目调试工具,高大上不?-----其实就是记录实时网络请求和崩溃日志相关等的小工具(此处一个会心的微笑). 然后我是这样写 ...
- Android之外部存储(SD卡)
*手机的外部存储空间,这个我们可以理解成电脑的外接移动硬盘,U盘也行.所有的Android设备都有两个文件存储区域:“内部”和“外部”存储器.这两个名称来自早期的Android,当时大多数设备都提供内 ...
- Android入门开发之SD卡读写操作(转)
SD卡的读写是我们在开发android 应用程序过程中最常见的操作.下面介绍SD卡的读写操作方式: 1. 获取SD卡的根目录 String sdCardRoot = Environment.getE ...
随机推荐
- Machine Schedule(二分图匹配之最小覆盖点,匈牙利算法)
个人心得:二分图啥的一点都不知道,上网借鉴了下,请参考http://blog.csdn.net/thundermrbird/article/details/52231639 加上自己的了解,二分图就是 ...
- python redis的基本使用
1.redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sor ...
- nginx 启用http2 https 无法访问的问题
原因: 1. openssl 版本过低 解决方法:进行升级 yum update openssl 2.ssl_ciphers 配置有问题 解决方法:修改为 ssl_ci ...
- EditPlus 3.41 p1115 0728注册码
EditPlus (2012-7-28 epp341p1115_0728) 注册码: 注册名:Free User 注册码:6AC8D-784D8-DDZ95-B8W3A-45TFA 注册名:Www.S ...
- FileStream读写文件
读文件示例 try { // 打开文件 FileStream fs = new FileStream("D:\\not.txt", FileMode.Open, FileAcces ...
- 【转】python 字符编码与解码——unicode、str和中文:UnicodeDecodeError: 'ascii' codec can't decode
原文网址:http://blog.csdn.net/trochiluses/article/details/16825269 摘要:在进行python脚本的编写时,如果我们用python来处理网页数据 ...
- Linux 制作补丁 打补丁 撤销补丁
1.制作补丁 diff - 逐行比较文件 格式 diff 参数 旧文件/旧文件夹 新文件/新文件夹 -N 将不存在的文件看作是空的 -a 将所有文件都视为文本文件 -u 以合并 ...
- Ubuntu 14.04 配置安卓5.1编译环境
Ubuntu 14.04版本 电脑cpu必须是64位 硬盘分配大约100G的空间 1.ubuntu中更新源 $ sudo apt-get update 2.android5.1需要安装openjdk- ...
- sed命令n,N,d,D,p,P,h,H,g,G,x解析
1.sed执行模板=sed '模式{命令1;命令2}'即逐行读入模式空间,执行命令,最后输出打印出来2.为方便下面,先说下p和P,p打印当前模式空间内容,追加到默认输出之后,P打印当前模式空间开端至\ ...
- 第六章 通过Service访问Pod(上)
不应该直接使用Pod的ID地址作为对外提供服务的接口,应为一旦Pod重启,IP地址就变化了,解决方案是使用Service. 6.1 创建Service K8s service从逻辑上代表了一组Pod, ...