android 开发-数据存储之文件存储

  android的文件存储是通过android的文件系统对数据进行临时的保存操作,并不是持久化数据,例如网络上下载某些图片、音频、视频文件等。如缓存文件将会在清理应用缓存的时候被清除,或者是应用卸载的时候缓存文件或内部文件将会被清除。

  以下是开发学习中所写的示例代码,以供日后查阅:

  xml:

 1 <RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 8     android:paddingTop="@dimen/activity_vertical_margin"
 9     tools:context=".MainActivity" >
10
11     <EditText
12         android:id="@+id/editText1"
13         android:layout_width="wrap_content"
14         android:layout_height="wrap_content"
15         android:layout_alignParentLeft="true"
16         android:layout_alignParentTop="true"
17         android:layout_marginTop="44dp"
18         android:ems="10" />
19
20     <Button
21         android:id="@+id/button1"
22         android:layout_width="wrap_content"
23         android:layout_height="wrap_content"
24         android:layout_alignRight="@+id/editText1"
25         android:layout_below="@+id/editText1"
26         android:layout_marginRight="57dp"
27         android:layout_marginTop="23dp"
28         android:text="保存信息" />
29
30 </RelativeLayout>

activity_main.xml

  activity:

  1 package com.example.android_data_storage_internal;
  2
  3 import java.io.ByteArrayOutputStream;
  4 import java.io.InputStream;
  5 import java.net.URI;
  6
  7 import org.apache.http.HttpResponse;
  8 import org.apache.http.client.HttpClient;
  9 import org.apache.http.client.methods.HttpGet;
 10 import org.apache.http.impl.client.DefaultHttpClient;
 11
 12 import android.app.Activity;
 13 import android.content.Context;
 14 import android.os.AsyncTask;
 15 import android.os.Bundle;
 16 import android.view.Menu;
 17 import android.view.View;
 18 import android.widget.Button;
 19 import android.widget.EditText;
 20 import android.widget.Toast;
 21
 22 import com.example.android_data_storage_internal.file.FileService;
 23 /**
 24  * @author xiaowu
 25  * @note 数据存储之文件内容存储
 26  */
 27 /**
 28  * @author xiaowu
 29  * @note 数据存储之文件内容存储(内部文件存储包括默认的文件存储、缓存文件存储)
 30  *         通过context对象获取文件路径
 31  *             context.getCacheDir();
 32  *             context.getFilesDir();
 33  *         //操作文件的模式:如果需要多种操作模式,可对文件模式进行相加
 34         //int  MODE_PRIVATE 私有模式
 35         //int  MODE_APPEND 追加模式
 36         //int  MODE_WORLD_READABLE 可读
 37         //int  MODE_WORLD_WRITEABLE 可写
 38  */
 39 public class MainActivity extends Activity {
 40     private EditText editText ;
 41     private Button button ;
 42     private FileService fileService;
 43     private final String IMAGEPATH ="http://b.hiphotos.baidu.com/zhidao/pic/item/738b4710b912c8fcda0b7362fc039245d78821a0.jpg";
 44     @Override
 45     protected void onCreate(Bundle savedInstanceState) {
 46         super.onCreate(savedInstanceState);
 47         setContentView(R.layout.activity_main);
 48         fileService = new FileService(this);
 49         button = (Button) findViewById(R.id.button1);
 50         editText = (EditText) findViewById(R.id.editText1);
 51         //增加按钮点击监听事件
 52         button.setOnClickListener(new View.OnClickListener() {
 53             @Override
 54             public void onClick(View v) {
 55                 String info = editText.getText().toString().trim();
 56                 boolean flag = fileService.SaveContentToFile("info.txt", Context.MODE_APPEND, info.getBytes());
 57                 if(flag){
 58                     Toast.makeText(MainActivity.this, "保存文件成功", 0).show();
 59                 }
 60                 //网络下载图片存储之本地
 61 //                MyTask task = new MyTask();
 62 //                task.execute(IMAGEPATH);
 63             }
 64         });
 65     }
 66     @Override
 67     public boolean onCreateOptionsMenu(Menu menu) {
 68         // Inflate the menu; this adds items to the action bar if it is present.
 69         getMenuInflater().inflate(R.menu.main, menu);
 70         return true;
 71     }
 72     //自定义异步任务,用于图片下载
 73     public class MyTask extends AsyncTask<String,  Integer, byte[]>{
 74         @Override
 75         protected byte[] doInBackground(String... params) {
 76             HttpClient httpClient = new  DefaultHttpClient();
 77             HttpGet httpGet = new HttpGet(params[0]);
 78             InputStream inputStream = null ;
 79             byte[] result = null;
 80             ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
 81             try {
 82                 //执行连接从response中读取数据
 83                 HttpResponse response = httpClient.execute(httpGet);
 84                 int leng = 0 ;
 85                 byte [] data = new byte[1024]  ;
 86                 if (response.getStatusLine().getStatusCode() == 200) {
 87                     inputStream = response.getEntity().getContent();
 88                     while((leng = inputStream.read(data)) != 0) {
 89                         byteArrayOutputStream.write(data, 0, leng);
 90                     }
 91                 }
 92                 result = byteArrayOutputStream.toByteArray();
 93                 fileService.SaveContentToFile("info.txt", Context.MODE_APPEND, result);
 94             } catch (Exception e) {
 95                 e.printStackTrace();
 96             }finally{
 97                 //关连接
 98                 httpClient.getConnectionManager().shutdown();
 99             }
100             return result;
101         }
102     }
103 }

  文件读写工具类Utils

  

  1 package com.example.android_data_storage_internal.file;
  2
  3 import java.io.ByteArrayOutputStream;
  4 import java.io.File;
  5 import java.io.FileInputStream;
  6 import java.io.FileOutputStream;
  7 import java.io.IOException;
  8
  9 import android.content.Context;
 10
 11 /**
 12  * @author xiaowu
 13  * @NOTE android文件读写帮助类
 14  */
 15 public class FileService {
 16     private Context context;
 17
 18     public FileService(Context context) {
 19         this.context = context;
 20     }
 21
 22     // fileName:文件名 mode:文件操作权限
 23     /**
 24      * @param fileName
 25      *            文件名
 26      * @param mode
 27      *            文件操作权限
 28      * @param data
 29      *            输出流读取的字节数组
 30      * @return
 31      */
 32     public boolean SaveContentToFile(String fileName, int mode, byte[] data) {
 33         boolean flag = false;
 34         FileOutputStream fileOutputStream = null;
 35         try {
 36             //通过文件名以及操作模式获取文件输出流
 37             fileOutputStream = context.openFileOutput(fileName, mode);
 38             fileOutputStream.write(data, 0, data.length);
 39         } catch (Exception e) {
 40             e.printStackTrace();
 41         } finally {
 42             if (fileOutputStream != null) {
 43                 try {
 44                     fileOutputStream.close();
 45                 } catch (Exception e) {
 46                     e.printStackTrace();
 47                 }
 48             }
 49         }
 50         return flag;
 51     }
 52
 53     /**
 54      * @param fileName
 55      *            文件名称
 56      * @return 文件内容
 57      */
 58     public String readContentFromFile(String fileName) {
 59         byte[] result = null;
 60         FileInputStream fileInputStream = null;
 61         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
 62         try {
 63             fileInputStream = context.openFileInput(fileName);
 64             int len = 0;
 65             byte[] data = new byte[1024];
 66             while ((len = fileInputStream.read(data)) != -1) {
 67                 outputStream.write(data, 0, len);
 68             }
 69             result = outputStream.toByteArray();
 70         } catch (Exception e) {
 71             e.printStackTrace();
 72         } finally {
 73             try {
 74                 outputStream.close();
 75             } catch (IOException e) {
 76                 // TODO Auto-generated catch block
 77                 e.printStackTrace();
 78             }
 79         }
 80         return new String(result);
 81     }
 82     /**
 83      * @param fileName 文件名称
 84      * @param mode 文件权限
 85      * @param data  输出流读取的字节数组
 86      * @return 是否成功标识
 87      */
 88     public boolean saveCacheFile(String fileName, byte[] data) {
 89         boolean flag = false;
 90         //通过context对象获取文件目录
 91         File file = context.getCacheDir();
 92         FileOutputStream fileOutputStream = null;
 93         try {
 94             File foder = new File(file.getAbsolutePath()+"/txt");
 95             if( !foder.exists() ){
 96                 foder.mkdir();    //创建目录
 97             }
 98             fileOutputStream = new FileOutputStream(foder.getAbsolutePath()+"/"+fileName);
 99             fileOutputStream.write(data, 0, data.length);
100 //                    context.openFileOutput("info.txt",
101 //                    Context.MODE_PRIVATE);
102         } catch (Exception e) {
103             e.printStackTrace();
104         } finally {
105             try {
106                 if (fileOutputStream != null) {
107                     fileOutputStream.close();
108                 }
109             } catch (IOException e) {
110                 // TODO Auto-generated catch block
111                 e.printStackTrace();
112             }
113         }
114         System.out.println(file.getAbsolutePath());
115         return flag;
116     }
117     /**
118      * 获取android内存文件夹下的文件列表
119      * @param path
120      * @return
121      */
122     public File[] listFileDir(String path){
123         //获取目录
124         File file = context.getFilesDir();
125 //        System.out.println("-->CacheDir"+context.getCacheDir());
126 //        /data/data/com.example.android_data_storage_internal/cache
127 //        System.out.println("-->FilesDir"+file);
128 //        /data/data/com.example.android_data_storage_internal/files
129         File root = new File(file.getAbsolutePath()+"/"+path);
130         File[] listFiles = root.listFiles();
131         return listFiles;
132     }
133 }

  Junit单元测试类:

 1 package com.example.android_data_storage_internal;
 2
 3 import android.content.Context;
 4 import android.test.AndroidTestCase;
 5 import android.util.Log;
 6
 7 import com.example.android_data_storage_internal.file.FileService;
 8 /**
 9  * @author xiaowu
10  * @note 单元测试类
11  *
12  */
13 public class MyTest extends AndroidTestCase {
14     private final String TAG = "MyTest";
15
16     public void save() {
17         FileService fileService = new FileService(getContext());
18         //操作文件的模式:如果需要多种操作模式,可对文件模式进行相加
19         //int  MODE_PRIVATE 私有模式
20         //int  MODE_APPEND 追加模式
21         //int  MODE_WORLD_READABLE 可读
22         //int  MODE_WORLD_WRITEABLE 可写
23         boolean flag = fileService.SaveContentToFile("login.txt", Context.MODE_PRIVATE,
24                 "你好".getBytes());
25         Log.i(TAG, "-->"+flag);
26     }
27     public void read(){
28         FileService fileService = new FileService(getContext());
29         String msg = fileService.readContentFromFile("info.txt");
30         Log.i(TAG, "--->"+msg);
31     }
32     public void test(){
33         FileService fileService = new FileService(getContext());
34         fileService.saveCacheFile("my.txt","小五".getBytes());
35     }
36     public void test2(){
37         FileService fileService = new FileService(getContext());
38         fileService.listFileDir("my.txt");
39     }
40 }

  清单文件:

  

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.example.android_data_storage_internal"
 4     android:versionCode="1"
 5     android:versionName="1.0" >
 6
 7     <uses-sdk
 8         android:minSdkVersion="8"
 9         android:targetSdkVersion="18" />
10
11     <instrumentation
12         android:name="android.test.InstrumentationTestRunner"
13         android:targetPackage="com.example.android_data_storage_internal" >
14     </instrumentation>
15     <!-- 增加用户访问网络权限 -->
16     <uses-permission android:name="android.permission.INTERNET"/>
17
18     <application
19         android:allowBackup="true"
20         android:icon="@drawable/ic_launcher"
21         android:label="@string/app_name"
22         android:theme="@style/AppTheme" >
23         <!-- 引入用与Junit测试包 -->
24         <uses-library android:name="android.test.runner" android:required="true"/>
25         <activity
26             android:name="com.example.android_data_storage_internal.MainActivity"
27             android:label="@string/app_name" >
28             <intent-filter>
29                 <action android:name="android.intent.action.MAIN" />
30
31                 <category android:name="android.intent.category.LAUNCHER" />
32             </intent-filter>
33         </activity>
34     </application>
35
36 </manifest>
时间: 2024-08-04 12:22:35

android 开发-数据存储之文件存储的相关文章

IOS开发--数据持久化篇文件存储(二)

前言:个人觉得开发人员最大的悲哀莫过于懂得使用却不明白其中的原理.在代码之前我觉得还是有必要简单阐述下相关的一些知识点. 因为文章或深或浅总有适合的人群.若有朋友发现了其中不正确的观点还望多多指出,不胜感激. 承接上篇博客我们来看看IOS开发中是如何将一个自定义的对象进行归档的 本篇博客将介绍以下几个方面的内容 1)普通的单个对象归档操作 2)拥有继承关系的对象归档 3)同时将多个对象进行归档 1.普通的单个对象归档操作 首先我们来看下最简单的单个对象归档操作 1.自定义一个跟小明一样有名的类(

关于Android开发数据存储的方式(一)

关于Android开发数据存储方式(一) 在厦门做Android开发也有两个月了,快情人节了.我还在弄代码. 在微信平台上开发自己的APP,用到了数据存储的知识,如今总结一下: 整体的来讲.数据存储方式有三种:一个是文件,一个是数据库,还有一个则是网络. 当中文件和数据库可能用的稍多一些.文件用起来较为方便.程序能够自定义格式:数据库用起稍烦锁一些,但它有它的长处.比方在海量数据时性能优越.有查询功能,能够加密,能够加锁.能够跨应用.跨平台等等.网络,则用于比較重要的事情,比方科研,勘探,航空等

关于Android开发数据存储的四大方式

关于Android开发数据存储的四大方式 在厦门做Android开发也有两个月了,快情人节了,我还在弄代码.在微信平台上开发自己的APP,用到了数据存储的知识,现在总结一下: 总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络.其中文件和数据库可能用的稍多一些,文件用起来较为方便,程序可以自己定义格式:数据库用起稍烦锁一些,但它有它的优点,比如在海量数据时性能优越,有查询功能,可以加密,可以加锁,可以跨应用,跨平台等等:网络,则用于比较重要的事情,比如科研,勘探,航空等实时

数据存储之文件存储

文件存储 TXT文件存储 # 爬取知乎上的热门话题,获取话题的问题.作者.答案,然后保存在TXT文本中 1 import requests 2 from pyquery import PyQuery 3 4 url = 'https://www.zhihu.com/explore' 5 headers = { 6 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, li

android存取数据方式:文件、SharedPreferences

android存取数据方式:文件.SharedPreferences.SQLite 数据库.Content provider 文件流: 使用java IO流对文件进行读写操作,文件权限默认. 指定文件权限写入:mode:文件权限MODE_PRIVATE的文件是应用程序私有的,MODE_WORLD_READABLE则所有应用程序都可以访问的, MODE_WORLD_WRITEABLE所有应用程序都可以写,mode_APPEND则是如果要创建的文件存在则新写入的数据不会覆盖以前的数据. openFi

对象存储与块存储、文件存储等对比

看到 一篇文档, 讲 对象存储, 好奇,搜索文章,摘抄,学习记录 ! 背景: 传统存储在面对海量非结构化数据时,在存储.分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结构化内容设计或优化.成本过高.并非PB级的扩展.不支持永远在线.专有的一体机设备等等,非结构化数据以每年60%-80%的速率增长,从而可扩展性变成了最迫切的需求. 传统存储在面对海量非结构化数据时,在存储.分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结构化内容设计或优化.成本过高.并非

块存储、文件存储、对象存储

知乎上看到的 [块存储] 典型设备:磁盘阵列,硬盘 块存储主要是将裸磁盘空间整个映射给主机使用的,就是说例如磁盘阵列里面有5块硬盘(为方便说明,假设每个硬盘1G),然后可以通过划逻辑盘.做 Raid.或者LVM(逻辑卷)等种种方式逻辑划分出N个逻辑的硬盘.(假设划分完的逻辑盘也是5个,每个也是1G,但是这5个1G的逻辑盘已经于原来的 5个物理硬盘意义完全不同了.例如第一个逻辑硬盘A里面,可能第一个200M是来自物理硬盘1,第二个200M是来自物理硬盘2,所以逻辑硬盘A是由多个 物理硬盘逻辑虚构出

磁盘工作原理、文件系统及i节点、块存储、文件存储、对象存储、DAS、NAS、还有SAN

(一)磁盘工作原理 一般硬盘正面贴有产品标签,主要包括厂家信息和产品信息,如商标.型号.序列号.生产日期.容量.参数和主从设置方法等.这些信息是正确使用硬盘的基本依据,下面将逐步介绍它们的含义. 硬盘主要由盘体.控制电路板和接口部件等组成,如图1-1所示.盘体是一个密封的腔体.硬盘的内部结构通常是指盘体的内部结构:控制电路板上主要有 硬盘BIOS.硬盘缓存(即CACHE)和主控制芯片等单元,如图1-2所示:硬盘接口包括电源插座.数据接口和主.从跳线,如图1-3所示. 图1-1 硬盘的外观 图1-

块存储、文件存储和对象存储

一.块存储 典型设备:磁盘阵列,硬盘 块存储主要是将裸磁盘空间整个映射给主机使用的,就是说例如磁盘阵列里面有5块硬盘(为方便说明,假设每个硬盘1G),然后可以通过划逻辑盘.做Raid.或者LVM(逻辑卷)等种种方式逻辑划分出N个逻辑的硬盘.(假设划分完的逻辑盘也是5个,每个也是1G,但是这5个1G的逻辑盘已经于原来的5个物理硬盘意义完全不同了.例如第一个逻辑硬盘A里面,可能第一个200M是来自物理硬盘1,第二个200M是来自物理硬盘2,所以逻辑硬盘A是由多个物理硬盘逻辑虚构出来的硬盘.) 接着块

块存储、文件存储、对象存储意义及差异

关于块存储.文件存储.对象存储方面的知识在知乎上看到了个很好的解答:https://www.zhihu.com/question/21536660 通俗易懂,查了些资料做了详细的补充. 块存储 典型设备:磁盘阵列.硬盘 块存储主要是将裸磁盘空间整个映射给主机使用的. 就是说例如:磁盘阵列里面有5块硬盘,然后可以通过划逻辑盘.做Raid.或者LVM等方式逻辑划分出N个逻辑的硬盘.但是逻辑盘和物理盘是两个完全不同的概念.假设每个硬盘100G,共有5个硬盘,划分为逻辑盘也为5个,每个100G,但是这5