android数据存储之文件存储

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





 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值