您的位置:首页 > 移动开发 > Android开发

【Android】android存储篇之 文件存储

2015-08-18 19:34 405 查看
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就完成了。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: