Android 文件操作详解及简单实例
Android文件操作详解
Android的文件操作说白了就是Java的文件操作的处理。所以如果对Java的io文件操作比较熟悉的话,android的文件操作就是小菜一碟了。好了,话不多说,开始今天的正题吧。
先从一个小项目入门吧
首先是一个布局文件,这一点比较的简单,那就直接上代码吧。
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="文件名称"/> <EditText android:id="@+id/et_filename" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="filename" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="文件内容"/> <EditText android:id="@+id/et_filecontent" android:layout_width="match_parent" android:layout_height="wrap_content" android:lines="7" android:hint="filecontent" /> <Button android:id="@+id/btn_save" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="toSave" android:text="Save" /> <Button android:id="@+id/btn_get" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="getFile" android:text="Get" /> </LinearLayout>
然后是我们的主界面的Java文件了。继续上代码
packagecom.mark.storage;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.Toast;
importcom.mark.service.FileService;
publicclassMainActivityextendsActivity{
privateEditTextmEt_filename,mEt_filecontent;
privateButtonmBtn_save;
privatevoidinit(){
mEt_filecontent=(EditText)findViewById(R.id.et_filecontent);
mEt_filename=(EditText)findViewById(R.id.et_filename);
mBtn_save=(Button)findViewById(R.id.btn_save);
}
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
/**
*保存数据到一个文件中
*@paramview
*/
publicvoidtoSave(Viewview){
StringfileName=mEt_filename.getText().toString();
StringfileContent=mEt_filecontent.getText().toString();
FileServiceservice=newFileService(getApplicationContext());
booleanisSucceed=service.save(fileName,fileContent);
if(isSucceed){
Toast.makeText(getApplicationContext(),"恭喜您保存文件成功!",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(getApplicationContext(),"对不起,您保存文件失败!",Toast.LENGTH_SHORT).show();
}
}
publicvoidgetFile(Viewview){
StringfileName=mEt_filename.getText().toString();
FileServiceservice=newFileService(getApplicationContext());
StringfileContent=service.getFile(fileName);
if(fileContent!=null||!fileContent.equals("")){
mEt_filecontent.setText(fileContent);
}else{
Toast.makeText(getApplicationContext(),"对不起,读取文件失败!",Toast.LENGTH_SHORT).show();
}
}
}
是不是感觉里面的代码有点奇怪呢?FileService是什么鬼?
其实FileService就是我们的业务类,主要的功能就是帮助我们实现了对文件的保存和读取等操作。下面也贴出代码
packagecom.mark.service;
importjava.io.ByteArrayOutputStream;
importjava.io.FileInputStream;
importjava.io.FileOutputStream;
importandroid.content.Context;
publicclassFileService{
//android自带的可以快速获得文件输出流的一个类,注意参数不能是路径,只能是文件名称
privateContextmContext;
publicFileService(Contextcontext){
this.mContext=context;
}
/**
*保存文件的一个方法
*@paramfileName
*@paramfileContent
*@return
*/
publicbooleansave(StringfileName,StringfileContent){
try{
//采用Context.MODE_PRIVATE模式的话,只允许本应用访问此文件,并且熟覆盖式的添加数据
FileOutputStreamfos=mContext.openFileOutput(fileName,Context.MODE_PRIVATE);
fos.write(fileContent.getBytes());
fos.close();
returntrue;
}catch(Exceptione){
e.printStackTrace();
returnfalse;
}
}
/**
*获得之前保存过的文件的详细的信息
*@paramfileName
*@return
*/
publicStringgetFile(StringfileName){
StringfileContent="";
try{
FileInputStreamfis=mContext.openFileInput(fileName);
byte[]buf=newbyte[1024];
intlen;
ByteArrayOutputStreambais=newByteArrayOutputStream();
while((len=fis.read(buf))!=-1){
bais.write(buf,0,len);
}
byte[]data=bais.toByteArray();
fileContent=newString(data);
fis.close();
returnfileContent;
}catch(Exceptione){
e.printStackTrace();
return"对不起,读取文件失败!";
}
}
}
业务类的分析
现在开始进入正题咯。这个小项目的核心就在于这个业务类,原因如下:
- Context:Android自带的上下文类,方便获得file流对象
- 读文件方法中使用到了ByteArrayOutputStream类,这一点是很重要的,如果只是单纯的使用字符串来读取存储的文件的话,就会因为序列化的问题而出现不了目标数据。
- 使用了返回值来对操作的结果进行了“反馈”,方便为用户提供友好的界面和使用体验。
核心
分层的思想,不同的功能的类放置到不同的包内,这样既方便程序的调试,也方便今后的代码的维护。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!