欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android使用文件进行数据存储的方法

程序员文章站 2023-11-27 18:53:58
本文实例讲述了android使用文件进行数据存储的方法。分享给大家供大家参考。具体如下: 很多时候我们开发的软件需要对处理后的数据进行存储,以供再次访问。android为...

本文实例讲述了android使用文件进行数据存储的方法。分享给大家供大家参考。具体如下:

很多时候我们开发的软件需要对处理后的数据进行存储,以供再次访问。android为数据存储提供了如下几种方式:

文件

sharedpreferences(参数)
sqlite数据库
内容提供者(content provider)

网络

首先给大家介绍使用文件如何对数据进行存储

activity提供了openfileoutput()方法可以用于把数据输出到文件中,具体的实现过程与在j2se环境中保存数据到文件中是一样的

public class fileactivity extends activity {
 @override
 public void oncreate(bundle savedinstancestate) {  
   fileoutputstream outstream = this.openfileoutput("ljq.txt", context.mode_private);
   outstream.write("我叫林计钦".getbytes());
   outstream.close(); 
 }
} 

openfileoutput(filename, mode)方法详解:

第一参数:

用于指定文件名称,不能包含路径分隔符“/”。如果文件不存在,android 会自动创建它。创建的文件保存在/data/data/<packagename>/files目录,如:/data/data/com.ljq.activity/files/itcast.txt ,通过点击myeclipse菜单“window”-“show view”-“other”,
在对话窗口中展开android文件夹,选择下面的file explorer视图,然后在file explorer视图中展开/data/data/<package name>/files目录就可以看到该文件

第二参数:

用于指定操作模式,有四种模式
context.mode_private  = 0
默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。
可以使用context.mode_append。
context.mode_append  = 32768
检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
context.mode_world_readable = 1
表示当前文件可以被其他应用读取
context.mode_world_writeable = 2
表示当前文件可以被其他应用写入

注意:

context.mode_world_readable和context.mode_world_writeable用来控制其他应用是否有权限读写该文件。
如果希望文件被其他应用读和写,可以传入: openfileoutput("ljq.txt", context.mode_world_readable + context.mode_world_writeable);   
android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data/<package name>/files),其他程序无法访问。除非在创建时指定了context.mode_world_readable或者context.mode_world_writeable ,只有这样其他程序才能正确访问。
如果要打开存放在/data/data/<package name>/files目录应用私有的文件,可以使用activity提供openfileinput()方法。
fileinputstream instream = this.getcontext().openfileinput("ljq.txt");
或者直接使用文件的绝对路径:
file file = new file("/data/data/com.ljq.action/files/ljq.txt");
fileinputstream instream = new fileinputstream(file);
注意:上面文件路径中的“com.ljq.action”为应用所在包,当你在编写代码时应替换为你自己应用使用的包。
对于私有文件只能被创建该文件的应用访问,如果希望文件能被其他应用读和写,可以在创建文件时,
指定context.mode_world_readable和context.mode_world_writeable权限。
activity还提供了getcachedir()和getfilesdir()方法:
getcachedir()方法用于获取/data/data/<package name>/cache目录
getfilesdir()方法用于获取/data/data/<package name>/files目录

案例

fileservice类:文件存取操作类

package com.ljq.service;
import java.io.bytearrayoutputstream;
import java.io.inputstream;
import java.io.outputstream;
public class fileservice {
 /**
  * 保存数据
  * 
  * @param outputstream
  * @param content
  * @throws exception
  */
 public static void save(outputstream outputstream, string content) throws exception {
  outputstream.write(content.getbytes());
  outputstream.close();
 }
 /**
  * 读取数据
  * 
  * @param inputstream
  * @return
  * @throws exception
  */
 public static string read(inputstream inputstream) throws exception {
  // 往内存写数据
  bytearrayoutputstream bytearrayoutputstream = new bytearrayoutputstream(); 
  // 缓冲区
  byte[] buffer = new byte[1024]; 
  int len = -1;
  while ((len = inputstream.read(buffer)) != -1) {
   bytearrayoutputstream.write(buffer, 0, len);
  }
  // 存储数据
  byte[] data = bytearrayoutputstream.tobytearray(); 
  bytearrayoutputstream.close();
  inputstream.close();
  return new string(data);
 }
}

fileservicetest测试类:

package com.ljq.service;
import java.io.inputstream;
import java.io.outputstream;
import android.content.context;
import android.test.androidtestcase;
import android.util.log;
/**
 * android测试
 * 
 * @author jiqinlin
 *
 */
public class fileservicetest extends androidtestcase {
 private final string tag = "fileservicetest"; 
 public void testsave() throws exception{
  outputstream outputstream = this.getcontext().openfileoutput("ljq.txt", context.mode_private);
  fileservice.save(outputstream, "abc");
 }
 public void testread() throws exception{
  inputstream inputstream= this.getcontext().openfileinput("ljq.txt");
  string content = fileservice.read(inputstream);
  log.i(tag, content);
 }
}

清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.ljq.activity"
  android:versioncode="1"
  android:versionname="1.0">
 <application android:icon="@drawable/icon" android:label="@string/app_name">
  <uses-library android:name="android.test.runner" />
  <activity android:name=".fileactivity"
     android:label="@string/app_name">
   <intent-filter>
    <action android:name="android.intent.action.main" />
    <category android:name="android.intent.category.launcher" />
   </intent-filter>
  </activity>
 </application>
 <uses-sdk android:minsdkversion="7" />
 <instrumentation android:name="android.test.instrumentationtestrunner"
   android:targetpackage="com.ljq.activity" android:label="tests for my app" />
</manifest> 

希望本文所述对大家的android程序设计有所帮助。