当前位置:   article > 正文

Android中的五种数据存储方式_android的数据存储方式有哪些?它们的特点有哪些?

android的数据存储方式有哪些?它们的特点有哪些?

这五种方式分别是:

1、SharedPreferences(偏好设置),读取XML文件

2、文件存储

(1)assets(程序内部的资源,只能读)

(2)data/data/主包名/files目录下的,能读能写 || 手机内存

(3)读SD卡中的文件,需要申请权限

3、SQLite---->http://blog.csdn.net/u013519020/article/details/52229013

4、ContentProvider

5、网络流


一、SharedPreferences(偏好设置)本身不支持写,通过Editor获得写的能力

特点:轻量级存储,存放在XML文件中,采用Key--Value存取。

文件位置:data / data / 主包名 / shared_prefs / *.XML

编译器查找方式:Window-->Show View-->--other-->File Explorer(资源管理器)

存:(权限在后面还会有介绍)

  1. Context ctx = MainActivity.this;
  2. //第一个参数是文件名,第二个是读写模式
  3. SharedPreferences sp=ctx.getSharedPreferences("t05", MODE_PRIVATE);
  4. //获得编译
  5. Editor editor = sp.edit();
  6. //存数据
  7. editor.putString("", "");
  8. editor.commit();
取:
  1. Context ctx = MainActivity.this;
  2. //第一个参数是文件名,第二个是读写模式
  3. SharedPreferences sp=ctx.getSharedPreferences("t05", MODE_PRIVATE);
  4. String s=sp.getString("key", "取不到值时的默认值");


----------------------------文件存储------------------------

A.assets(只读、不能修改或删除),这个是编译时存放的资源文件位置如图。


读取数据:

  1. try {
  2. //创建流
  3. InputStream in = this.getAssets().open("文件名.扩展名");
  4. //读出数据
  5. Bitmap bm=BitmapFactory.decodeStream(in);
  6. in.close();
  7. in=null;
  8. } catch (IOException e) {
  9. // TODO Auto-generated catch block
  10. e.printStackTrace();
  11. }

B.读写数据(读写手机自身内存)

位置:data/data/主包名/files目录下的  || 也可以使用context.getFilesDir().getAbsolutePath()获得内存根路径

存:

  1. try {
  2. OutputStream os=this.openFileOutput("文件名", MODE_PRIVATE);
  3. os.write("wa".getBytes());
  4. os.close();
  5. } catch (FileNotFoundException e) {
  6. e.printStackTrace();
  7. } catch (IOException e) {
  8. e.printStackTrace();
  9. }

取:
  1. try {
  2. InputStream in=this.openFileInput("文件名");
  3. //缓冲区
  4. byte b[]=new byte[1024];
  5. //创建缓存
  6. ByteArrayBuffer ba=new ByteArrayBuffer(0);
  7. int l;
  8. //读
  9. while((l=in.read(b))>-1)
  10. {
  11. ba.append(b,0,l);
  12. }
  13. //转化
  14. String s=new String(ba.toByteArray());
  15. } catch (FileNotFoundException e) {
  16. e.printStackTrace();
  17. } catch (IOException e) {
  18. e.printStackTrace();
  19. }

C.SDCard读写文件

(一).首先要在AndroidManifest.XML中添加权限,两种方式添加:

1.傻瓜式添加

打开这个清单文件-->Permissions-->Add-->Permission(创建权限)、Uses Permission(申请/使用权限)

Name中选择:    android.permission.READ_EXTERNAL_STORAGE//写权限

android.permission.WRITE_EXTERNAL_STORAGE//读权限

android.permission.MOUNT_UNMOUNT_FILESYSTEMS//创建、删除

2.牛人式添加(手敲)

  1. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  2. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
  3. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

在manifest节点中添加


(二).判断SDCard是否存在

Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);

(三).得到SDCard路径

File dir = Environment.getExternalStorageDirectory();


(四).基本的文件流读写文件

....此处省略一万个字


(五).关闭流,关闭文件,关闭一切,赋null,注意顺序。


---------------------------权限介绍-----------------------------------

权限共有四种,来自于context:

1.MODE_PRIVATE = 0

2.MODE_APPEND = 32768
3.MODE_WORLD_READABLE = 1
4.MODE_WORLD_WRITEABLE = 2

MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容。
MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取。
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
 
  如果希望文件被其他应用读和写,可以传入: openFileOutput("itcast.txt",MODE_WORLD_READABLE + MODE_WORLD_WRITEABLE); android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data//files),其他程序无法访问。 除非在创建时指定了MODE_WORLD_READABLE或者MODE_WORLD_WRITEABLE ,只有这样其他程序才能正确访问。


-------封装成组件---------

这是使用的方式,单例模式
  1. if(FileManager.getInitialize().isSdCardAvailable()){
  2. path = FileManager.getInitialize().getSDOrCache(this, "/ambow/asso/apk/");
  3. }
  4. else
  5. path = FileManager.getInitialize().getSDOrCache(this, "");
文件管理的组件
  1. public class FileManager {
  2. private static FileManager manager;
  3. /**
  4. * 有效缓存时间是3天
  5. */
  6. private static final long maxCacheTime = 1000*60*60*24*15;
  7. /**
  8. * 构造函数
  9. * @param context
  10. */
  11. public FileManager(){
  12. }
  13. /**
  14. * 单例,获取FileManager实例
  15. * @param context
  16. * @return
  17. */
  18. public static FileManager getInitialize(){
  19. if(manager == null)
  20. manager = new FileManager();
  21. return manager;
  22. }
  23. /**
  24. * 获取缓存cache目录路径
  25. * @param context 上下文
  26. * @return
  27. */
  28. public String getCacheDir(Context context, String path){
  29. StringBuffer dir = new StringBuffer();
  30. dir.append(context.getFilesDir().getAbsolutePath());
  31. if(!path.startsWith("/"))
  32. dir.append("/");
  33. dir.append(path);
  34. File file = new File(dir.toString());
  35. if(!file.exists())
  36. file.mkdirs();
  37. return dir.toString();
  38. }
  39. /**
  40. * 获取sd卡缓存路径
  41. *
  42. * @param path 路径
  43. * @return
  44. * 有sd卡的返回sd上的路径
  45. * 没有sd卡返回null
  46. */
  47. public String getSDDir(String path){
  48. if(!isSdCardAvailable())return null;
  49. StringBuffer dir = new StringBuffer();
  50. dir.append(Environment.getExternalStorageDirectory());
  51. if(!path.startsWith("/"))
  52. dir.append("/");
  53. dir.append(path);
  54. File file = new File(dir.toString());
  55. if(!file.exists())
  56. file.mkdirs();
  57. return dir.toString();
  58. }
  59. /**
  60. * 获取缓存文件的路径
  61. * @param path 缓存文件的路径
  62. * @param url 保存的文件的url
  63. * @return
  64. */
  65. public String getCacheFileUrl(Context context,String path, String url){
  66. return getSDOrCache(context,path)+formatPath(url);
  67. }
  68. /**
  69. * 获取缓存路径
  70. * @param context 上下文
  71. * @param path 路径
  72. * @return
  73. * 有sd卡返回sd上的路径
  74. * 没有sd卡返回cach中的路径
  75. */
  76. public String getSDOrCache(Context context, String path){
  77. String url = null;
  78. if(isSdCardAvailable())
  79. url = getSDDir(path);
  80. else
  81. url = getCacheDir(context, path);
  82. return url;
  83. }
  84. /**
  85. * 检测内存卡是否可用
  86. * @return 可用则返回 true
  87. */
  88. public boolean isSdCardAvailable(){
  89. if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
  90. return true;
  91. }
  92. return false;
  93. }
  94. /**
  95. * 格式化url地址
  96. * 以便根据url来命名文件
  97. * @param name 图片url
  98. * @return
  99. */
  100. public String formatPath(String name){
  101. String path = name;
  102. path = path.replace(":", "_");
  103. path = path.replace("/", "_");
  104. return path;
  105. }
  106. /**
  107. * 判断该路径的文件是否存在
  108. * @param path 文件路径(完全路径)
  109. * @return
  110. */
  111. public boolean isExists(String path){
  112. File file = new File(path);
  113. if(file.exists())
  114. return true;
  115. return false;
  116. }
  117. /**
  118. * 判断当前目录是否存在文件
  119. * @param path
  120. * @return
  121. */
  122. public boolean hasMoreFile(String path){
  123. File file = new File(path);
  124. if(!file.exists())
  125. return false;
  126. String[] files = file.list();
  127. if(files == null || files.length == 0)
  128. return false;
  129. return true;
  130. }
  131. /**
  132. * 清除sd卡中过期的缓存
  133. *
  134. * @param basePath 路径(要清楚文件的路径)
  135. */
  136. public void cleanInvalidCache(String basePath){
  137. File file = new File(basePath);
  138. if(!file.exists()) return;
  139. File[] caches = file.listFiles();
  140. if(caches == null || caches.length == 0) return;
  141. long now = System.currentTimeMillis();
  142. try {
  143. for(int i=0;i<caches.length;i++){
  144. if((now - caches[i].lastModified()) < maxCacheTime){
  145. continue;
  146. }
  147. caches[i].delete();
  148. try {
  149. Thread.sleep(10);
  150. } catch (InterruptedException e) {
  151. e.printStackTrace();
  152. //每删除一张图片后停留10毫秒,防止cpu占用率过高,造成程序无响应
  153. }
  154. }
  155. } catch (Exception e) {
  156. e.printStackTrace();
  157. }
  158. }
  159. /**
  160. * 保存保存输入流
  161. * @param path 要保存的完全路径
  162. * @param is 网络获取的inputstream流
  163. */
  164. public void saveInputStream(String path,InputStream is){
  165. if(!isExists(path)){
  166. File file = new File(path);
  167. FileOutputStream fos = null;
  168. try {
  169. fos = new FileOutputStream(file);
  170. int size = 0;
  171. byte[] buffer = new byte[1024];
  172. while((size = is.read(buffer)) != -1)
  173. fos.write(buffer, 0, size);
  174. fos.flush();
  175. fos.close();
  176. } catch (FileNotFoundException e) {
  177. e.printStackTrace();
  178. } catch (IOException e) {
  179. e.printStackTrace();
  180. }
  181. finally{
  182. try {
  183. if(fos != null){
  184. fos.close();
  185. fos = null;
  186. }
  187. if(file != null)
  188. file = null;
  189. } catch (IOException e) {
  190. e.printStackTrace();
  191. }
  192. }
  193. }
  194. }
  195. /**
  196. * 从文件中读取流
  197. * @param path 文件路径
  198. * @return
  199. */
  200. public InputStream loadInputStream(String path){
  201. InputStream is = null;
  202. if(isExists(path)){
  203. File file = new File(path);
  204. try {
  205. is = new FileInputStream(file);
  206. } catch (FileNotFoundException e) {
  207. e.printStackTrace();
  208. return null;
  209. }
  210. }
  211. return is;
  212. }
  213. /**
  214. * 把对象写入文件
  215. *
  216. * @throws Exception
  217. */
  218. public void WriteObject(Object obj,Context context,String path) throws Exception {
  219. FileOutputStream fis = context.openFileOutput(path, Context.MODE_PRIVATE);
  220. ObjectOutputStream oos = new ObjectOutputStream(fis);
  221. oos.writeObject(obj);
  222. oos.close();
  223. fis.close();
  224. }
  225. /**
  226. * 从文件读取对象
  227. *
  228. * @return
  229. * @throws Exception
  230. */
  231. public Object readObject(Context context,String path) throws Exception {
  232. Object obj = new Object();
  233. FileInputStream fis = context.openFileInput(path);
  234. ObjectInputStream oos = new ObjectInputStream(fis);
  235. obj = oos.readObject();
  236. oos.close();
  237. fis.close();
  238. return obj;
  239. }
  240. /**
  241. * 删除保存文件
  242. * @param path 文件的完整路径
  243. */
  244. public void delete(String path){
  245. File file = new File(path);
  246. if(file.exists())
  247. file.delete();
  248. }
  249. }




转载请声明:http://blog.csdn.net/u013519020/article/details/52233421

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/576302
推荐阅读
相关标签
  

闽ICP备14008679号