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>

 

posted @ 2015-03-28 14:23  HEWU  阅读(420)  评论(0编辑  收藏  举报