博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android使用文件进行数据存储
阅读量:6691 次
发布时间:2019-06-25

本文共 5386 字,大约阅读时间需要 17 分钟。

hot3.png

1、Context.MODE_PRIVATE:为默认操作模式,代表该文件时私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖文件的内容,如果想把新写入的内容追加到原文件中,可以使用Context.,MODE_APPEND。

 

package org.example.service;

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 {
  
   /*
    * 1、根据上下文对象能快速得到一个文件输出流对象;
    * 2、私有操作模式:创建出来的文件只能被本应用访问,其他应用无法访问该文件:Context.MODE_PRIVATE;
    * 另外采用私有操作模式创建的文件,写入的内容会覆盖原文件的内容。
    * 3、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 文件名称
   * 文件内容
   * @throws Exception
   */
  public String read(String filename) throws Exception
  {
   /*
    * 1、从上下文对象中得到一个文件输入流对像,context.openFileInput(filename)得到文件输入流对象;
    * 2、
    */
   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);
  }

}

2、Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。

 /**

     * 使用追加模式保存文件
     * @param filename
     * @param content
     * @throws Exception
     */
 public void saveAppend(String filename, String content) throws Exception {
  
  /*
   * 1、根据上下文对象能快速得到一个文件输出流对象;
   * 2、追加操作模式:创建出来的文件只能被本应用访问,其他应用无法访问该文件:Context.MODE_PRIVATE;
   * 另外采用追加操作模式创建的文件,先会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
   * 3、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();  
  
 }

3、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 {
  
  /*
   * 1、根据上下文对象能快速得到一个文件输出流对象;
   * 2、MODE_WORLD_TEADABLE:表示当前文件可以被其他应用读取,创建的文件,写入的内容会覆盖原文件的内容。
   * 3、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 {
  
  /*
   * 1、根据上下文对象能快速得到一个文件输出流对象;
   * 2、MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入,创建的文件,写入的内容会覆盖原文件的内容。
   * 3、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();   
  
 }
 

4、如果希望文件被其他应用读和写,可以传入:

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 {
  
  /*
   * 1、根据上下文对象能快速得到一个文件输出流对象;
   * 2、Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用读写和写入,创建的文件,写入的内容会覆盖原文件的内容。
   * 3、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();    
    }

5、android有一套自己的安全模式,当应用程序(.apk)在安装时系统就会分配给他一个userId,当前应用要去访问其他资源比如文件的时候,就需要userId匹配。默认情况下,任何应用创建文件,sharedpreferences,数据库都应该是私有的(位于/data/data/<package name>/files),其他程序无法访问。除非在创建是指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE,只有这样其他程序才能正确访问。

 6、如果要打开放在/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目录

 

转载于:https://my.oschina.net/u/273709/blog/87684

你可能感兴趣的文章
c++ 二叉树打印节点路径
查看>>
BOS中常用方法和类
查看>>
append的问题
查看>>
git &github 快速入门
查看>>
JS中的几种函数
查看>>
ios--编码规范
查看>>
JsCV Core v0.2发布 & Javascript图像处理系列目录
查看>>
一种模仿线程的Javascript异步模型设计&实现
查看>>
bzoj 2784 [JLOI2012]时间流逝——树上高斯消元
查看>>
jQuery的一些一些小知识点的用法的介绍
查看>>
gdb调试
查看>>
在ListActivity底部添加一个不动的button解决办法
查看>>
lsof命令
查看>>
mongodb启动后打不开http://127.0.0.1:28017/
查看>>
iPhone上划动事件--UISwipeGestureRecognizer
查看>>
OD调试2---TraceMe
查看>>
Linux C single linked for any data type
查看>>
单元测试本质:面向逻辑块
查看>>
个人觉得还可以的php代码,老大不买账
查看>>
xml解析
查看>>