Android之openFileoutput和openFileinput

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);





  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值