安卓开发_数据存储技术_外部存储

简介: 安卓外部存储,即将数据存储在sdcard中,当然存储的前提是手机或者模拟器先具有sdcard目录 然而上一句话还是有歧义的。 事实上所有的安卓设备都有外部存储和内部存储,这两个名称来源于安卓的早期设备,那个时候的设备内部存储确实是固定的,而外部存储确实是可以像U盘一样移动的。

安卓外部存储,即将数据存储在sdcard中,当然存储的前提是手机或者模拟器先具有sdcard目录

然而上一句话还是有歧义的。

事实上所有的安卓设备都有外部存储和内部存储,这两个名称来源于安卓的早期设备,那个时候的设备内部存储确实是固定的,而外部存储确实是可以像U盘一样移动的。但是在后来的设备中,很多中高端机器都将自己的机身存储扩展到了8G以上,他们将存储在概念上分成了"内部internal" 和"外部external" 两部分,但其实都在手机内部。所以不管安卓手机是否有可移动的sdcard,他们总是有外部存储和内部存储。最关键的是,我们都是通过相同的api来访问可移动的sdcard或者手机自带的存储(外部存储)。

 

因为存储空间有限,内部存储只适用于存储数据量小的情况,当数据量比较大的时候(存放下载的电影音乐等),就需要将数据外部存储

 

-------------------------------------------------------------------------------------------------------------------------------

开发的时候在创建模拟器的时候

这里SD Card 要设置一个大小,否则模拟器没有sdcard目录

 

--------------------------------------------------------------------------------------------------------------------------

 

1 public static final String IMAGE_URL = Environment.getExternalStorageDirectory()+"/myfile/image";
2     public static final int FORMAT_PNG = 1;
3     public static final int FOEMAT_JPEG = 2;

 

一些外部存储需要的方法:

1、判断扩展卡是否存在

1     public static boolean isMounted(){
2         String state = Environment.getExternalStorageState();
3         return state.equals(Environment.MEDIA_MOUNTED);
4     }

 

2、获取指定路径下的文件的文件名

1 public static String getFileName(String path)
2     {
3         return path.substring(path.lastIndexOf("/")+1);
4     }

 

3、获得当前sd卡中剩余存储空间的大小(单位兆)

 1 public static int remainedSize(){
 2         //文件系统状态管理对象StatFs
 3         StatFs fs = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath());
 4         int count = fs.getFreeBlocks(); //空闲的数据块个数
 5         int size = fs.getBlockSize();   //返回每个数据块的大小
 6         
 7         //计算剩余空间
 8         long total_byte = count*size; //字节单位的大小
 9         int total_m = (int) (total_byte*size/1024/1024);//兆单位的大小
10         
11         return total_m;
12     }

 

4、将字节格式的图片数据源保存到sdcard中

 1     public static void saveImage(String path, byte data[]) throws IOException
 2     {
 3         //判断扩展卡是否挂载
 4         if(!isMounted())
 5             return ;
 6         File fileDir = new File(IMAGE_URL);
 7         //如果路径下该文件目录不存在,则新建目录
 8         if(!fileDir.exists())
 9         {
10             fileDir.mkdirs();
11         }
12         
13         FileOutputStream fos = new FileOutputStream(new File(fileDir,getFileName(path)));
14         fos.write(data);
15         fos.close();
16         
17     }

 

5、将Bitmap格式的图片存放到sd卡

public static void saveImage(String path,Bitmap bitmap , int format) throws FileNotFoundException
    {
        //判断扩展卡是否挂载
        if(!isMounted())
            return;
        //判断目录是否存在
        File fileDir = new File(IMAGE_URL);
        //如果路径下该文件目录不存在,则新建目录
        if(!fileDir.exists())
        {
            fileDir.mkdirs();
        }
        //把图片数据写入到一个图片文件
        FileOutputStream fos = new FileOutputStream(new File(fileDir,getFileName(path)));
        
        //压缩图片 第一个参数是压缩后的格式,第二个参数是压缩后的效果,值越大,效果越好,第三个参数是输入流
        bitmap.compress(format==1?CompressFormat.PNG:CompressFormat.JPEG, 100, fos);
        
    }

 

6、从扩展卡中读取指定路径图片数据

 1 public static Bitmap readImage(String path)
 2     {
 3         if(!isMounted())
 4             return null;
 5         //获得文件名
 6         String fileName = getFileName(path);
 7         File file = new File(IMAGE_URL,fileName);
 8         Bitmap bitmap = null;
 9         if(file.exists())
10         {
11             bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
12         }
13         return bitmap;
14     }

 

7、清空指定路径下的所有文件夹和文件

 1 public static void clear(){
 2             //判断扩展卡是否挂载
 3             if(!isMounted())
 4                 return ;
 5             File fileDir = new File(IMAGE_URL);
 6             //如果指定目录存在
 7             if(fileDir.exists())
 8             {
 9                 //获取指定目录下的所有文件及目录
10                 File fileArray[] = fileDir.listFiles();
11                 for(File f:fileArray)
12                 {
13                     f.delete();
14                 }
15             }
16         }

 

---------------------------------------------------------------------------------------------------------------------------

Demo:从指定路径下载一张图片保存到sdcard下并显示在ImageView视图中,如果本地已存在,则不再下载,直接显示图片在ImageView中

 1 package com.xqx_outer;
 2 
 3 import tools.DownImageAsycnTask;
 4 import tools.FileUtil;
 5 import android.app.Activity;
 6 import android.graphics.Bitmap;
 7 import android.os.Bundle;
 8 import android.view.View;
 9 import android.view.View.OnClickListener;
10 import android.widget.Button;
11 import android.widget.ImageView;
12 
13 public class MainActivity extends Activity {
14 
15     private ImageView imageView;
16     private Button btn_down;
17     public static final String path = "http://images2015.cnblogs.com/blog/493196/201509/493196-20150909121120762-2089133734.jpg";
18     @Override
19     protected void onCreate(Bundle savedInstanceState) {
20         super.onCreate(savedInstanceState);
21         setContentView(R.layout.activity_main);
22         imageView = (ImageView) findViewById(R.id.id_image);
23         btn_down = (Button) findViewById(R.id.id_btn);
24         
25         
26         btn_down.setOnClickListener(new OnClickListener() {
27             
28             @Override
29             public void onClick(View v) {
30                 // TODO Auto-generated method stub
31                 ImageDownLoad();
32             }
33         });
34     }
35 
36     public void ImageDownLoad()
37     {
38         Bitmap bitmap = null;
39         //先从扩展卡中读取指定路径下的图片
40         bitmap = FileUtil.readImage(path);
41         //如果图片存在,则将图片放在图片视图中
42         if(bitmap!=null)
43         {
44             imageView.setImageBitmap(bitmap);
45         }
46         //如果不存在,开启异步任务下载图片
47         else
48         {
49             new DownImageAsycnTask(imageView).execute(path);
50             
51         }
52         
53         
54     }
55 }
MainActivity.class
 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical"
 6     android:gravity="center_horizontal"
 7        >
 8 
 9     <ImageView 
10         android:layout_width="100dp"
11         android:layout_height="100dp"
12         android:id="@+id/id_image"
13         />
14     <Button 
15         android:layout_width="wrap_content"
16         android:layout_height="wrap_content"
17         android:id="@+id/id_btn"
18         android:text="下载"
19         />
20 
21 </LinearLayout>
layout_main.xml
 1 package tools;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 
 6 import android.graphics.Bitmap;
 7 import android.graphics.BitmapFactory;
 8 import android.os.AsyncTask;
 9 import android.widget.ImageView;
10 
11 public class DownImageAsycnTask extends AsyncTask<String, Void, Bitmap>{
12     private ImageView image ;
13     public DownImageAsycnTask(ImageView image){
14         this.image = image;
15     }
16     @Override
17     protected Bitmap doInBackground(String... params) {
18         // TODO Auto-generated method stub
19         Bitmap bitmap = null;
20         //params[0] 为数据源路径
21         if(params[0]!=null)
22         {
23             try {
24                 //获得指定路径上数据的字节数据
25                 byte b[] = HttpUtil.getInput(params[0]);
26                 //将字节数组数据转换为bitmap格式的图片
27                 bitmap = BitmapFactory.decodeByteArray(b, 0, b.length);
28                 //将图片缓冲到扩展卡中
29                 FileUtil.saveImage(params[0], bitmap,2);
30             } catch (IOException e) {
31                 // TODO Auto-generated catch block
32                 e.printStackTrace();
33             }
34             
35         }
36         return bitmap;    
37     }
38     @Override
39     protected void onPostExecute(Bitmap result) {
40         // TODO Auto-generated method stub
41         super.onPostExecute(result);
42         image.setImageBitmap(result);
43     }
44 }
网络数据异步下载
  1 package tools;
  2 
  3 import java.io.File;
  4 import java.io.FileNotFoundException;
  5 import java.io.FileOutputStream;
  6 import java.io.IOException;
  7 import java.text.Normalizer.Form;
  8 
  9 import android.graphics.Bitmap;
 10 import android.graphics.Bitmap.CompressFormat;
 11 import android.graphics.BitmapFactory;
 12 import android.os.Environment;
 13 import android.os.StatFs;
 14 
 15 public class FileUtil {
 16     //Environment.getExternalStorageDirectory()获取外部存储空间的目录
 17     public static final String IMAGE_URL = Environment.getExternalStorageDirectory()+"/myfile/image";
 18     public static final int FORMAT_PNG = 1;
 19     public static final int FOEMAT_JPEG = 2;
 20     
 21     //判断扩展卡是否挂载
 22     public static boolean isMounted(){
 23         String state = Environment.getExternalStorageState();
 24         return state.equals(Environment.MEDIA_MOUNTED);
 25     }
 26     
 27     //得到特定路径下的文件的文件名
 28     public static String getFileName(String path)
 29     {
 30         return path.substring(path.lastIndexOf("/")+1);
 31     }
 32     
 33     //获取扩展卡的剩余内存空间
 34     public static int remainedSize(){
 35         //文件系统状态管理对象StatFs
 36         StatFs fs = new StatFs(Environment.getExternalStorageDirectory().getAbsolutePath());
 37         int count = fs.getFreeBlocks(); //空闲的数据块个数
 38         int size = fs.getBlockSize();   //返回每个数据块的大小
 39         
 40         //计算剩余空间
 41         long total_byte = count*size; //字节单位的大小
 42         int total_m = (int) (total_byte*size/1024/1024);//兆单位的大小
 43         
 44         return total_m;
 45     }
 46     
 47     //将字节格式的图片保存到扩展卡
 48     public static void saveImage(String path, byte data[]) throws IOException
 49     {
 50         //判断扩展卡是否挂载
 51         if(!isMounted())
 52             return ;
 53         File fileDir = new File(IMAGE_URL);
 54         //如果路径下该文件目录不存在,则新建目录
 55         if(!fileDir.exists())
 56         {
 57             fileDir.mkdirs();
 58         }
 59         
 60         FileOutputStream fos = new FileOutputStream(new File(fileDir,getFileName(path)));
 61         fos.write(data);
 62         fos.close();
 63         
 64     }
 65     
 66     //保存bitmap格式的图片到扩展卡
 67     public static void saveImage(String path,Bitmap bitmap , int format) throws FileNotFoundException
 68     {
 69         //判断扩展卡是否挂载
 70         if(!isMounted())
 71             return;
 72         //判断目录是否存在
 73         File fileDir = new File(IMAGE_URL);
 74         //如果路径下该文件目录不存在,则新建目录
 75         if(!fileDir.exists())
 76         {
 77             fileDir.mkdirs();
 78         }
 79         //把图片数据写入到一个图片文件
 80         FileOutputStream fos = new FileOutputStream(new File(fileDir,getFileName(path)));
 81         
 82         //压缩图片 第一个参数是压缩后的格式,第二个参数是压缩后的效果,值越大,效果越好,第三个参数是输入流
 83         bitmap.compress(format==1?CompressFormat.PNG:CompressFormat.JPEG, 100, fos);
 84         
 85     }
 86     
 87     //从扩展卡中读取图片的功能
 88     public static Bitmap readImage(String path)
 89     {
 90         if(!isMounted())
 91             return null;
 92         //获得文件名
 93         String fileName = getFileName(path);
 94         File file = new File(IMAGE_URL,fileName);
 95         Bitmap bitmap = null;
 96         if(file.exists())
 97         {
 98             bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
 99         }
100         return bitmap;
101     }
102         //清空扩展卡中指定目录的所有数据
103         public static void clear(){
104             //判断扩展卡是否挂载
105             if(!isMounted())
106                 return ;
107             File fileDir = new File(IMAGE_URL);
108             //如果指定目录存在
109             if(fileDir.exists())
110             {
111                 //获取指定目录下的所有文件及目录
112                 File fileArray[] = fileDir.listFiles();
113                 for(File f:fileArray)
114                 {
115                     f.delete();
116                 }
117             }
118         }
119     
120     
121 }
外部存储工具类
 1 package tools;
 2 
 3 import java.io.ByteArrayOutputStream;
 4 import java.io.IOException;
 5 import java.io.InputStream;
 6 import java.net.HttpURLConnection;
 7 import java.net.URL;
 8 import java.nio.ByteOrder;
 9 
10 public class HttpUtil {
11     public static byte[] getInput(String path) throws IOException
12     {
13         URL url = new URL(path);
14         HttpURLConnection conn = (HttpURLConnection) url.openConnection();
15         conn.setRequestMethod("GET");
16         conn.setConnectTimeout(5000);
17         conn.setDoInput(true);
18         if(conn.getResponseCode()==200)
19         {
20             InputStream in = conn.getInputStream();
21             return getbyte(in);
22         }
23         return null;
24         
25     }
26     
27     public static byte[] getbyte(InputStream in) throws IOException
28     {
29         ByteArrayOutputStream out = new ByteArrayOutputStream();
30         int len = 0;
31         byte b[] = new byte[1024];
32         while((len=in.read(b))!=-1)
33         {
34             out.write(b,0,len);
35         }
36         return out.toByteArray();
37         
38         
39     }
40 }
数据连接工具类

文件保存位置:mnt/sdcard/myfile/image/下载的文件

 

-------------------------------------------------------------------------------------------------------------------------------------

相关知识:

安卓开发_数据存储技术_内部存储

安卓开发_数据存储技术_SharedPreferences类

安卓开发_数据存储技术_sqlite

相关文章
|
6天前
|
编解码 Java Android开发
通义灵码:在安卓开发中提升工作效率的真实应用案例
本文介绍了通义灵码在安卓开发中的应用。作为一名97年的聋人开发者,我在2024年Google Gemma竞赛中获得了冠军,拿下了很多项目竞赛奖励,通义灵码成为我的得力助手。文章详细展示了如何安装通义灵码插件,并通过多个实例说明其在适配国际语言、多种分辨率、业务逻辑开发和编程语言转换等方面的应用,显著提高了开发效率和准确性。
|
5天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
18 5
|
3天前
|
JSON Java Android开发
探索安卓开发之旅:打造你的第一个天气应用
【10月更文挑战第30天】在这个数字时代,掌握移动应用开发技能无疑是进入IT行业的敲门砖。本文将引导你开启安卓开发的奇妙之旅,通过构建一个简易的天气应用来实践你的编程技能。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你宝贵的学习资源。我们将一步步地深入到安卓开发的世界中,从搭建开发环境到实现核心功能,每个环节都充满了发现和创造的乐趣。让我们开始吧,一起在代码的海洋中航行!
|
5天前
|
缓存 数据库 Android开发
安卓开发中的性能优化技巧
【10月更文挑战第29天】在移动应用的海洋中,性能是船只能否破浪前行的关键。本文将深入探讨安卓开发中的性能优化策略,从代码层面到系统层面,揭示如何让应用运行得更快、更流畅。我们将以实际案例和最佳实践为灯塔,引领开发者避开性能瓶颈的暗礁。
16 3
|
6天前
|
安全 搜索推荐 Android开发
揭秘安卓与iOS系统的差异:技术深度对比
【10月更文挑战第27天】 本文深入探讨了安卓(Android)与iOS两大移动操作系统的技术特点和用户体验差异。通过对比两者的系统架构、应用生态、用户界面、安全性等方面,揭示了为何这两种系统能够在市场中各占一席之地,并为用户提供不同的选择。文章旨在为读者提供一个全面的视角,理解两种系统的优势与局限,从而更好地根据自己的需求做出选择。
19 2
|
7天前
|
存储 IDE 开发工具
探索Android开发之旅:从新手到专家
【10月更文挑战第26天】在这篇文章中,我们将一起踏上一段激动人心的旅程,探索如何在Android平台上从零开始,最终成为一名熟练的开发者。通过简单易懂的语言和实际代码示例,本文将引导你了解Android开发的基础知识、关键概念以及如何实现一个基本的应用程序。无论你是编程新手还是希望扩展你的技术栈,这篇文章都将为你提供价值和启发。让我们开始吧!
|
7天前
|
安全 搜索推荐 Android开发
揭秘iOS与安卓系统的差异:一场技术与哲学的较量
在智能手机的世界里,iOS和Android无疑是两大巨头,它们不仅定义了操作系统的标准,也深刻影响了全球数亿用户的日常生活。本文旨在探讨这两个平台在设计理念、用户体验、生态系统及安全性等方面的本质区别,揭示它们背后的技术哲学和市场策略。通过对比分析,我们将发现,选择iOS或Android,不仅仅是选择一个操作系统,更是选择了一种生活方式和技术信仰。
|
13天前
|
Java API Android开发
安卓应用程序开发的新手指南:从零开始构建你的第一个应用
【10月更文挑战第20天】在这个数字技术不断进步的时代,掌握移动应用开发技能无疑打开了一扇通往创新世界的大门。对于初学者来说,了解并学习如何从无到有构建一个安卓应用是至关重要的第一步。本文将为你提供一份详尽的入门指南,帮助你理解安卓开发的基础知识,并通过实际示例引导你完成第一个简单的应用项目。无论你是编程新手还是希望扩展你的技能集,这份指南都将是你宝贵的资源。
42 5
|
12天前
|
设计模式 IDE Java
探索安卓开发:从新手到专家的旅程
【10月更文挑战第22天】 在数字时代的浪潮中,移动应用开发如同一座金矿,吸引着无数探险者。本文将作为你的指南针,指引你进入安卓开发的广阔天地。我们将一起揭开安卓平台的神秘面纱,从搭建开发环境到掌握核心概念,再到深入理解安卓架构。无论你是初涉编程的新手,还是渴望进阶的开发者,这段旅程都将为你带来宝贵的知识和经验的财富。让我们开始吧!
|
13天前
|
安全 Android开发 iOS开发
iOS与安卓:技术生态的双雄争霸
在当今数字化时代,智能手机操作系统的竞争愈发激烈。iOS和安卓作为两大主流平台,各自拥有独特的技术优势和市场地位。本文将从技术架构、用户体验、安全性以及开发者支持四个方面,深入探讨iOS与安卓之间的差异,并分析它们如何塑造了今天的移动技术生态。无论是追求极致体验的苹果用户,还是享受开放自由的安卓粉丝,了解这两大系统的内在逻辑对于把握未来趋势至关重要。