Android使用文件进行数据存储

一、Context.MODE_PRIVATE:为默认操做模式,表明该文件时私有数据,只能被应用自己访问,在该模式下,写入的内容会覆盖文件的内容,若是想把新写入的内容追加到原文件中,可使用Context.,MODE_APPEND。 java

 

package org.example.service; android

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream; 数据库

import android.content.Context; 数组

public class FileService {
 
  /**
   * (文件的IO技术)提供上下文对象
   */
  private Context context;
 
  /**
   * 经过构造器给context赋值
   */
 
  public FileService(Context context) {
   this.context = context;
  }
  /**
   * 保存文件
   * @param filename 文件名称
   * @param content 文件内容
   */
  public void save(String filename, String content) throws Exception {
  
   /*
    * 一、根据上下文对象能快速获得一个文件输出流对象;
    * 二、私有操做模式:建立出来的文件只能被本应用访问,其余应用没法访问该文件:Context.MODE_PRIVATE;
    * 另外采用私有操做模式建立的文件,写入的内容会覆盖原文件的内容。
    * 三、openFileOutput()方法的第一个参数用于指定文件名称,不能包含路径分隔符"/",若是文件不存在,
    * Android会自动建立它,建立的文件保存在/data/data/<package name>/files目录,如/data/data/org.example.files/files.
    */
   FileOutputStream outStream = context.openFileOutput(filename, Context.MODE_PRIVATE);
   //把字符串传化为二进制数据写入到文件中
   outStream.write(content.getBytes());
   //而后关掉这个流
   outStream.close();
  
  
  }
 
  /**
   * 读取文件内容
   * @param filename 文件名称
   * @return 文件内容
   * @throws Exception
   */
  public String read(String filename) throws Exception
  {
   /*
    * 一、从上下文对象中获得一个文件输入流对像,context.openFileInput(filename)获得文件输入流对象;
    * 二、
    */
   FileInputStream inStream = context.openFileInput(filename);
   //把每次读到的数据都存放在内存中
   ByteArrayOutputStream outStream = new ByteArrayOutputStream();
   //定义数组大小
   byte[] buffer = new byte[1024];
   int len = 0;
   //读取这个输入流数组,判断数据是否读完
   while((len = inStream.read(buffer)) != -1)
   {
    outStream.write(buffer,0,len);
   }
   //从内存中获取获得的数据
   byte[] data = outStream.toByteArray();
   //转化为字符
   return new String(data);
  } 安全

} this

二、Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,不然就建立新文件。 .net

 /**
     * 使用追加模式保存文件
     * @param filename
     * @param content
     * @throws Exception
     */
 public void saveAppend(String filename, String content) throws Exception {
  
  /*
   * 一、根据上下文对象能快速获得一个文件输出流对象;
   * 二、追加操做模式:建立出来的文件只能被本应用访问,其余应用没法访问该文件:Context.MODE_PRIVATE;
   * 另外采用追加操做模式建立的文件,先会检查文件是否存在,存在就往文件追加内容,不然就建立新文件。
   * 三、openFileOutput()方法的第一个参数用于指定文件名称,不能包含路径分隔符"/",若是文件不存在,
   * Android会自动建立它,建立的文件保存在/data/data/<package name>/files目录,如/data/data/org.example.files/files.
   */
  FileOutputStream outStream = context.openFileOutput(filename, Context.MODE_APPEND);
   //把字符串传化为二进制数据写入到文件中
   outStream.write(content.getBytes());
   //而后关掉这个流
   outStream.close();  
  
 } 对象

三、Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其余应用是否有权限读写该文件。 内存

1)MODE_WORLD_TEADABLE:表示当前文件能够被其余应用读取。 资源

/**
     * 使用READABLE建立文件
     * @param filename
     * @param content
     * @throws Exception
     */
 public void saveReadable(String filename, String content) throws Exception {
  
  /*
   * 一、根据上下文对象能快速获得一个文件输出流对象;
   * 二、MODE_WORLD_TEADABLE:表示当前文件能够被其余应用读取,建立的文件,写入的内容会覆盖原文件的内容。
   * 三、openFileOutput()方法的第一个参数用于指定文件名称,不能包含路径分隔符"/",若是文件不存在,
   * Android会自动建立它,建立的文件保存在/data/data/<package name>/files目录,如/data/data/org.example.files/files.
   */
  FileOutputStream outStream = context.openFileOutput(filename, Context.MODE_WORLD_READABLE);
 //把字符串传化为二进制数据写入到文件中
   outStream.write(content.getBytes());
   //而后关掉这个流
   outStream.close();   
  
 }

2)MODE_WORLD_WTITEABLE:表示当前文件能够被其余应用写入,但不能读取其数据。

/**
     * 使用WRITEABLE建立文件
     * @param filename
     * @param content
     * @throws Exception
     */
 public void saveWriteable(String filename, String content) throws Exception {
  
  /*
   * 一、根据上下文对象能快速获得一个文件输出流对象;
   * 二、MODE_WORLD_WRITEABLE:表示当前文件能够被其余应用写入,建立的文件,写入的内容会覆盖原文件的内容。
   * 三、openFileOutput()方法的第一个参数用于指定文件名称,不能包含路径分隔符"/",若是文件不存在,
   * Android会自动建立它,建立的文件保存在/data/data/<package name>/files目录,如/data/data/org.example.files/files.
   */
  FileOutputStream outStream = context.openFileOutput(filename, Context.MODE_WORLD_WRITEABLE);
  //把字符串传化为二进制数据写入到文件中
   outStream.write(content.getBytes());
   //而后关掉这个流
   outStream.close();   
  
 }
 

四、若是但愿文件被其余应用读和写,能够传入:

openFileOutput("hello.txt",Context.MODE_WORLE_TEADABLE + Context.MODE_WOTLD_WRITEABLE);

/**
  * 建立可以进行读和写的文件
  * @param filename
  * @param content
  * @throws Exception
  */
    public void saveRW(String filename, String content) throws Exception {
  
  /*
   * 一、根据上下文对象能快速获得一个文件输出流对象;
   * 二、Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE:表示当前文件能够被其余应用读写和写入,建立的文件,写入的内容会覆盖原文件的内容。
   * 三、openFileOutput()方法的第一个参数用于指定文件名称,不能包含路径分隔符"/",若是文件不存在,
   * Android会自动建立它,建立的文件保存在/data/data/<package name>/files目录,如/data/data/org.example.files/files.
   */
  FileOutputStream outStream = context.openFileOutput(filename, Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
  //把字符串传化为二进制数据写入到文件中
   outStream.write(content.getBytes());
   //而后关掉这个流
   outStream.close();    
    }

五、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("hello.txt");

Log.i("FileTest".readInStream(inStream));

或者直接使用文件的绝对路径:

File file = new File("/data/data//data/data/org.example.files/files.txt");

FileInputStream inStream = new FileInputStream(file);

Log.i("FileTest".readInStream(inStream));

注意:上面文件路径中"org.example.files"为应用所在包,当你在编写代码时应替换为你本身应用使用的包。

对于私有文件只能被建立该文件的应用访问,若是但愿文件能被其余应用读和写,能够在建立文件时,指定Context.MODE_WORLD_READABLE和Context.MODE_WRITEABLE权限。

Activity还提供了getCacheDir()和getFilesDir()方法:

getCacheDir()方法用于获取/data/data/<package name>/cache目录

getFilesDir()方法用于获取/data/data/<package name>/files目录

相关文章
相关标签/搜索