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