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

android数据存储之文件存储

2016-09-09 00:28 411 查看
android数据存储,可以分为五种,分别是:

1 使用SharedPreferences存储数据

2 文件存储数据
3 SQLite数据库存储数据
4 使用ContentProvider存储数据
5 网络存储数据

这五种的数据存储中,前四种是存储在本地的,网络存储数据,不是存储在手机中,而是网络请求数据,然后在写入。而网络请求,请求来的数据,需要分别对待,有的仅仅用户显示,再次跳回这个界面的时候,再次发送请求,从网络中获取。而有的需要我们将数据存储起来,这个时候,可以使用SharedPreferences存储,可以使用文件存储,可以使用SQLite数据库存储,可以存储复杂的数据,但是执行效率相对低一些;也可以将数据放入到缓存中,而缓存中有涉及到很多知识,存储知识就变的很大,很多。其实还有一种数据存储,这个数据存储,是放入在src/assets文件下的资源,这些资源可以是json格式的数据,xml文件数据,还可以是其他格式的数据。

第一个讲到的是文件存储。

文件存储是将数据写入到一个文件中。文件存储,是用来存放大量数据,如文本,图片,音频。默认的存放路径/data/data/<>/files/***.***; 该处的<>是包名,后面的***.***是存储发文件名。

先看一段代码,从代码入手:

public void save(){
try {
FileOutputStream outStream=this.openFileOutput("a.txt",Context.MODE_WORLD_READABLE);
outStream.write(text.getText().toString().getBytes());
outStream.close();
Toast.makeText(MyActivity.this,"Saved",Toast.LENGTH_LONG).show();
} catch (FileNotFoundException e) {
return;
}
catch (IOException e){
return ;
}
}
这里讲一些文件存储流程,和java文件读写一样,其实就是java文件读写,只不过android会默认路径。

首先会获取一个文件输入流FileOutputStream,获取流之后,就可以将信息写入到文件中,最后关闭掉。流程很简单。不过这里来看一下openFileOutPut(fileName,mode);中的fileName是不需要有‘/’分隔符的,并且当文件不存在的时候,android会自动创建该文件。而model是用来指定操作模式的。

它有四种模式,分别是:

Context.MODE_PRIVATE = 0
Context.MODE_APPEND = 32768
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2

Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。

将信息写入到文件中,同时,还需要将文件读取出来。文件读取的流程,先获取到一个文件流,该流就是保存的信息。然后在解析成自己需要的数据。

public void load(){
try {
FileInputStream inStream=this.openFileInput("a.txt");//获取流
ByteArrayOutputStream stream=new ByteArrayOutputStream();//通过byte[]桥梁,将文件写入到ByteArrayoutputStream中。
byte[] buffer=new byte[1024];
int length=-1;
while((length=inStream.read(buffer))!=-1)   {
stream.write(buffer,0,length);
}
stream.close();<span style="white-space:pre">	</span>//关闭流
inStream.close();
text.setText(stream.toString());
Toast.makeText(MyActivity.this,"Loaded",Toast.LENGTH_LONG).show();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e){
return ;
}
}

上面说到默认的文件路径名称。当需要这个名称的时候,如何获取呢,使用getFilesDir()方法用于获取/data/data//files目录。
下面,来介绍一个工具类,这个工具类可以将类写入到文件中,并且读取出来,就很方便。

/**
* 文件读取工具
* Created by ice on 2016/6/7.
*/
public class FileUtil {
/**
* 文件序列化对象列表
*
* @param obj
* @param fileName
* @param mode
*/
public static void writeObjsToFile(Object obj, String fileName, int mode) {

if (obj == null || fileName == null)
return;

FileOutputStream fos = null;
ObjectOutputStream oos = null;
try {
fos = SheBaoApp.getContext().openFileOutput(URLEncoder.encode(fileName, "UTF-8"), mode);
oos = new ObjectOutputStream(fos);
oos.writeObject(obj);
oos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (oos != null) {
oos.close();
}
if (fos != null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

/**
* 从序列化文件中读取对象列表
*
* @param fileName
* @return
*/
public static Object readObjsFromFile( String fileName) {

if (fileName == null)
return null;

Object obj = null;
FileInputStream fis = null;
ObjectInputStream ois = null;
try {
fileName = URLEncoder.encode(fileName, "UTF-8");
if (SheBaoApp.getContext().getFileStreamPath(fileName).exists()) {
fis = SheBaoApp.getContext().openFileInput(fileName);
ois = new ObjectInputStream(fis);
obj = ois.readObject();
}
} catch (FileNotFoundException e) {

e.printStackTrace();
} catch (StreamCorruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
if (ois != null) {
ois.close();
}
if (fis != null) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}

return obj;
}

/**
* 判断文件是否存在
* @return
*/
public static boolean fileIsExists(Context context, String fileName) {
try {
File f = new File(context.getFilesDir(), fileName);
if (!f.exists()) {
return false;
}

} catch (Exception e) {
return false;
}
return true;
}

//文件的写入方式参数:保存的信息,文件夹的名字,保存类型
// FileUtil.writeObjsToFile(loginInfoModel,Const.STUDENTINFO, Context.MODE_PRIVATE);
//文件读取方式 参数:文件名
//FileUtil.readObjsFromFile(Const.STUDENTINFO);
}




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