openFileOutput和openFileinput来保存读取文件。
openFileOutput(String name,MODE)方法的第一参数用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android 会自动创建它。创建的文件保存在/data/data/<package name>/files目录。第二参数用于指定操作模式,有四种模式,分别为: Context.MODE_PRIVATE
Context.MODE_APPEND
Context.MODE_WORLD_READABLE
Context.MODE_WORLD_WRITEABLE
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容。Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件里追加内容,否则就创建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
如果希望文件被其他应用读和写,可以传入:
openFileOutput(“itcast.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 ,只有这样其他程序才能正确访问。
下面通过两种方法实例来了解用法:
第一种:创建两个类来完成保存读取操作。
MainActivity类中的代码:
public class MainActivity extends Activity implements OnClickListener {
private Button save;
private Button read;
private EditText writefilesname;
private EditText writefilescontent;
private TextView showsavecontent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
save=(Button)findViewById(R.id.save);
read=(Button)findViewById(R.id.read);
save.setOnClickListener(this);
read.setOnClickListener(this);
}
@Override
public void onClick(View v) {
//创建第二个类的对象,用来调用第二类中保存和读取的方法
SaveRead file=new SaveRead();
//找到文件名编辑的组件和文件内容编辑的组件,在通过getText方法来获取EditText中的文本信息
writefilesname=(EditText)findViewById(R.id.writefilesname);
writefilescontent=(EditText)findViewById(R.id.writefilescontent);
showsavecontent=(TextView)findViewById(R.id.showsavecontent);
String filesname=writefilesname.getText().toString().trim();
switch (v.getId()) {
case R.id.save:
try {
//得到文件内容信息
String content=writefilescontent.getText().toString().trim();
//通过openFileOutput方法保存文件名和保存的类型
OutputStream outStream=MainActivity.this.openFileOutput(filesname, Context.MODE_PRIVATE);
//调用第二个类中的save方法,参数传递文件名和文件内容
file.save(outStream, content);
Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
}
break;
case R.id.read:
try {
//通过openFileInput方法获取读取的文件名
InputStream inStream=MainActivity.this.openFileInput(filesname);
//将从inStream流中读取的字节流内容转换成String类型
String content=file.read(inStream);
Toast.makeText(this, "读取成功", Toast.LENGTH_SHORT).show();
showsavecontent.setText(content);
} catch (Exception e) {
e.printStackTrace();
}
default:
break;
}
}
}
SaveRead类中的代码:
public class SaveRead {
public void save(OutputStream outputStream,String content) throws IOException{
//将得到的文件内容转换成字节写入内存中
outputStream.write(content.getBytes());
//关闭输出流
outputStream.close();
}
public String read(InputStream inStream) throws IOException{
//创建一个缓冲区来存放读取出来的数据
ByteArrayOutputStream outStream=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int length;
while((length=inStream.read(buffer))!=-1){
//将读取出来的数据写入这个缓冲区
outStream.write(buffer,0,length);
}
//将字节类型数据转化成String类型
byte[] data=outStream.toByteArray();
outStream.close();
inStream.close();
//new一个String对象将data的数据返回
return new String(data);
}
}
效果图:
第二种方法:用一个类完成保存读取操作。
MainActivity类中的代码:
public class MainActivity extends Activity implements OnClickListener {
private Button save;
private Button read;
private EditText writefilesname;
private EditText writefilescontent;
private TextView showsavecontent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
save=(Button)findViewById(R.id.save);
read=(Button)findViewById(R.id.read);
save.setOnClickListener(this);
read.setOnClickListener(this);
writefilesname=(EditText)findViewById(R.id.writefilesname);
writefilescontent=(EditText)findViewById(R.id.writefilescontent);
showsavecontent=(TextView)findViewById(R.id.showsavecontent);
}
public void save(){
try {
//获得文件内容
String content=writefilescontent.getText().toString().trim();
//通过openFileOutput来指定保存文件的名字和保存的类型
OutputStream outStream=MainActivity.this.openFileOutput(writefilesname.getText().toString().trim(), MODE_APPEND);
//将得到的文件内容转换成字节写入内存中
outStream.write(content.getBytes());
outStream.flush();
outStream.close();
Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();
}catch(FileNotFoundException e){
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
public void read(){
try {
//通过openFileInput方法获取读取的文件名
InputStream inStream=MainActivity.this.openFileInput(writefilesname.getText().toString().trim());
ByteArrayOutputStream outStream=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];
int length;
while((length=inStream.read(buffer))!=-1){
outStream.write(buffer,0,length);
}
byte[] data=outStream.toByteArray();
outStream.close();
inStream.close();
String content=new String(data);
showsavecontent.setText(content);
}catch(FileNotFoundException e){
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.save:
save();
break;
case R.id.read:
read();
default:
break;
}
}
}
个人理解:保存时:
外界输入信息-->outputStream-->保存到手机内存中
需要的方法:outStream.write(content.getBytes())
读取时:
手机内存-->inputStream-->outputStream-->显示读取内容
手机内存-->inputStream:采用inStream.read()读取字节数据
inputStream-->outputStream:采用ByteArrayOutputStream outStream=new ByteArrayOutputStream()创建缓冲区,将读取的内容用outStream.write(buffer,0,length)方法写入缓冲区
outputStream-->显示读取内容:将字节类型数据转化成String类型 byte[] data=outStream.toByteArray(); //new一个String对象将data的数据返回 return new String(data); 或者直接new一个String String content=new String(data);