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目录