Android 数据存储--文件存储

来源:互联网 发布:淘宝卖家发布宝贝教程 编辑:程序博客网 时间:2024/03/29 08:26

Android 文件存储–
Step 1: 使用SD卡
在使用SD卡之前,一定要判断设备的SD卡是否可用,这里只需要一个简单的语句就可以了:

String state=Environment.getExternalStorageState();if(Environment.MEDIA_MOUNTED.equals(state)){    //如果代码能执行到这里就说明这个设备的SD卡是可用的,那么就可以在这里进行后续的操作了。}

这个时候我们关心的是什么是Environment,什么是MEDIA_MOUNTED,在开发文档中有这样的说明:
Environment:Provides access to environment variables.
MEDIA_MOUNTED :Storage state if the media is present and mounted at its mount point with read/write access.
MEDIA_MOUNTED就表面设备上的媒体是安装好和准备就绪的,这样我们就可以对这个存储设备进行操作了。
Step 2:往SD卡上写操作。
设备一旦可用,现在就可以在SD卡上写东西了。和JAVA 的文件操作差不多,android上也是用文件流的方式对文件进行操作的。

public boolean saveContentToSdcard(String fileName, String content) {        boolean flag = false;        FileOutputStream fileOutputStream = null;        // 获得sdcard卡所在的路径        File file = new File(Environment.getExternalStorageDirectory(),                fileName);        // 判断sdcard卡是否可用        if (Environment.MEDIA_MOUNTED.equals(Environment                .getExternalStorageState())) {            try {                fileOutputStream = new FileOutputStream(file);                fileOutputStream.write(content.getBytes());                flag = true;            } catch (FileNotFoundException e) {                // TODO Auto-generated catch block                e.printStackTrace();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            } finally {                if (fileOutputStream != null) {                    try {                        fileOutputStream.close();                    } catch (IOException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                }            }        }        return flag;    }

用这样的一个实例方法来说明:
FileOutputStream fileOutputStream = null;
这是一个文件输出流,我们就是利用这个stream向SD卡中写入文件
这样的一个输出流在实例化的时候一定要绑定一个地址明确、文件名称明确的文件
fileOutputStream = new FileOutputStream(file);
这样系统才会知道这个文件流是要往哪里写文件的。
文件流内的数据通过 fileOutputStream.write(content.getBytes());
也就是write方法写入,一定要注意写入的是字节数组~计算机只认识二进制数据。
剩下的就是 catch\finally 这些结构化的东西了,还要注意一点就是文件流在操作结束之后是一定要关闭的。
好了,写文件就是这样,好像比较简单。(对了,往设备上写文件在计算机中叫output输出,读叫input输入,好像
有点和我们常规的理解不大一致,不过就是这样~)
Step 3: 从SD卡中读文件
显然,读文件的话就是用FileOutputStream来操作了。
还是用一个示例方法来说明:

public String getFileFromSdcard(String fileName) {        FileInputStream inputStream = null;        // 缓存的流,和磁盘无关,不需要关闭        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();        File file = new File(Environment.getExternalStorageDirectory(),                fileName);        if (Environment.MEDIA_MOUNTED.equals(Environment                .getExternalStorageState())) {            try {                inputStream = new FileInputStream(file);                int len = 0;                byte[] data = new byte[1024];                while ((len = inputStream.read(data)) != -1) {                    outputStream.write(data, 0, len);                }            } catch (FileNotFoundException e) {                // TODO Auto-generated catch block                e.printStackTrace();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            } finally {                if (inputStream != null) {                    try {                        inputStream.close();                    } catch (IOException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                }            }        }        return new String(outputStream.toByteArray());    }

好像相比上面的写操作而言,这里的读取操作有一点点的复杂…确实,这里我们虽然使用FileInputStream这个类来获取
文件信息,但是最终的结果却是用ByteArrayOutputStream这个东西来呈现的,这是一个可以称为缓冲流的东西,
注意这个方法最终返回的String(outputStream.toByteArray()),中的outputStream就是一个ByteArrayOutputStream

while ((len = inputStream.read(data)) != -1) {                    outputStream.write(data, 0, len);                }

注意这一段, FileInputStream中的read(),的定义是这样的:
public int read (byte[] buffer, int byteOffset, int byteCount)
Added in API level 1
Reads up to byteCount bytes from this stream and stores them in the byte array buffer starting at byteOffset. Returns the number of bytes actually read or -1 if the end of the stream has been reached.
所以,只要len不为-1,那就继续往下读取。len 为-1就到了这个文件流的结尾了。
对于ByteArrayOutputStream 的write,有这样的定义:
public synchronized void write (byte[] buffer, int offset, int len)
Added in API level 1 Writes count bytes from the byte array buffer starting at offset index to this stream.
Parameters
buffer the buffer to be written.
offset the initial position in buffer to retrieve bytes.
len the number of bytes of buffer to write.

0 0
原创粉丝点击