android开发中,最常用的就是存储了,android中有四大存储方式,这里介绍文件存储。
文件存储可以存储到data/data/文件名,即手机内存和SD中,
首先是,存储到手机内存中:
简单的布局不在赘述。还有简单的MainActivity:
private final class buttonListener implements View.OnClickListener{ @Override public void onClick(View v) { // TODO Auto-generated method stub String filername = name.getText().toString(); String content = filer.getText().toString(); FilerServices service = new FilerServices(getApplicationContext()); try { service.save(filername,content); } catch (Exception e) { // TODO Auto-generated catch block Toast.makeText(MainActivity.this, "保存失败", 5).show(); e.printStackTrace(); } Toast.makeText(MainActivity.this, "保存成功", 5).show(); } }
存储到的services:
private Context context; public FilerServices(Context context) { this.context = context; } public void save(String filername, String content) throws Exception { //第二个参数是指,保存的方式,这里是隐私操作方式,只能被本程序访问 FileOutputStream ouStream = context.openFileOutput(filername, Context.MODE_PRIVATE); ouStream.write(content.getBytes()); ouStream.close(); }
这里是用的私有操作方式,只能被本程序访问,其他程序不能访问该文件。介绍一下其他三种操作方式:
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
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 ,只有这样其他程序才能正确访问。
文件的读取:
private final class readListener implements View.OnClickListener{ String result; @Override public void onClick(View v) { // TODO Auto-generated method stub String filername = name.getText().toString(); FilerServices service = new FilerServices(getApplicationContext()); try { result =service.read(filername); } catch (Exception e) { // TODO Auto-generated catch block Toast.makeText(MainActivity.this, "读取失败", 5).show(); e.printStackTrace(); } Toast.makeText(MainActivity.this, "读取成功", 5).show(); filer.setText(result); } }
读取的services:
public String read(String filername) throws Exception{ FileInputStream inStream =context.openFileInput(filername); byte[] data =StreamTool.read(inStream); String result=new String(data,"utf-8"); return result; }
很简单的一个流的读取,这里我把读取操作抽象成一个工具类,以便以后复用:
这里把代码贴出来,以前的文章有对这个工具类的详细解读,感兴趣的话可以去看一看:
public class StreamTool { public static byte[] read(InputStream inStream) throws Exception { // TODO Auto-generated method stub ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len =0; while((len=inStream.read(buffer))!= -1){ outStream.write(buffer, 0, buffer.length); } inStream.close(); return outStream.toByteArray(); } }
最后就是将文件写入SD卡了:
public void savetoSD(String filername, String content) throws Exception { //判读是否存在SD卡 if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ File sdCardDir = Environment.getExternalStorageDirectory();//获取SDCard目录 File saveFile = new File(sdCardDir, filername); FileOutputStream outStream = new FileOutputStream(saveFile); outStream.write(content.getBytes()); outStream.close(); } }
一个简单Demo就完成了。