Android数据存储的外部存储总结

来源:互联网 发布:淘宝钻石展位考试 编辑:程序博客网 时间:2024/04/28 08:17

      本文对Android外部存储器ExternalStorage的使用做总结。
      一.基本使用
      有些Android设备都支持共享的外部储存用来保存文件,这可以是SD卡等可以移除的存储介质, 也可以是手机内存等不可移除的存储介质,保存的名部存储文件都是全局可读的,而且在用户使用USB连接电脑后,可以读取或修改这些文件的数据。
      Android的API提供的外部存储器的根目录:
Environment.getExternalStorageDirectory()+”/”
      每一个手机的目录结构可能不相同!

      这里Android的外部存储器的数据的存储跟java的数据文件的存储基本是一样的,只是路径不一样而已。
      文件的存储和读取基本使用的是字节流。

      数据存储使用的是输出流FileOutputStream
      数据读取使用的是输入流FileInputStream

下面用一个简答的程序回顾一下,文件的存储和读取

(一)xml布局文件设计

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <EditText        android:id="@+id/main_et_content"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="Hello World!" />    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:onClick="save"        android:text="save" />    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:onClick="read"        android:text="read" />    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:onClick="getAllFile"        android:text="获取SD卡下面所有的文件名字" /></LinearLayout>

(二)java代码设计

package com.lwz.sd;import android.os.Bundle;import android.os.Environment;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.EditText;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.util.ArrayList;import java.util.List;/** * 外部存储器,一般指的是就是SD卡空间 * 但是这里的文件的路径就要指定好,每一个手机或模拟器的SD卡的路径是不一定相同 * 所有使用Environment.getExternalStorageDirectory().getAbsoluteFile();最保险 * 而且要注意权限的添加 */public class MainActivity extends AppCompatActivity {    EditText et_content;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        et_content = (EditText) findViewById(R.id.main_et_content);    }    //向SD卡的根目录下存放文件    public void save(View v) {        //SD卡的根路径        File file = Environment.getExternalStorageDirectory().getAbsoluteFile();        try {            //获取输出流            FileOutputStream fos = new FileOutputStream(file + "/aa.txt");            //写信息            fos.write(et_content.getText().toString().getBytes());            //刷新输出流,并关闭流            fos.flush();            fos.close();        } catch (Exception e) {            e.printStackTrace();        }    }    //向SD卡的根目录下读取文件    public void read(View v) {        //SD卡的根路径        File file = Environment.getExternalStorageDirectory().getAbsoluteFile();        try {            //获取输出流            FileInputStream fis = new FileInputStream(file + "/aa.txt");            //读信息            int len = 0;            byte[] buf = new byte[1024];            while ((len = fis.read(buf)) != -1) {                //把读取到的信息放到输入框内                et_content.append(new String(buf, 0, len));            }            //关闭流            fis.close();        } catch (Exception e) {            e.printStackTrace();        }    }    //显示SD卡下面的所有文件的名字    //这里时间比较久要用线性来搞    public void getAllFile(View view) {        //SD卡的根路径        final File file = Environment.getExternalStorageDirectory().getAbsoluteFile();        //保存文件的集合        final List<File> listFile = new ArrayList<>();        //使用线程来遍历文件        new Thread() {            @Override            public void run() {                super.run();                findAllFind(file, listFile);                for (File f : listFile) {                    Log.e("TAG", f.getAbsolutePath());                }            }        }.start();    }    //遍历文件的方法    void findAllFind(File file, List<File> list) {        //获取文件夹下所有文件名        File[] files = file.listFiles();        //如果是个空文件夹直接返回方法        if (files == null) {            return;        }        //对每一个文件遍历        for (File file1 : files) {            //如果是文件夹,继续遍历            if (file1.isDirectory()) {                findAllFind(file1, list);            } else {                //如果是文件就添加文件名到集合里面                list.add(file1);            }        }    }}

程序运行前要再AndroidManifest中添加用户的外部存储的权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

程序运行后的显示结果:
s1
点击获取外部存储器文件路径后显示的情况:
s2

上面的LogCat页面显示的内容,还有很多内容显示不完。。

二.外部存储的知识相关:

(一)Environment类

Environment 是一个提供访问环境变量的类。

比如要判断外部存储空间的情况
获取存储器状态

       String state = Environment.getExternalStorageState();        //sd卡就绪状态        if (state.equals(Environment.MEDIA_MOUNTED)) {            //外部存储器            Toast.makeText(this, "可以使用外部存储器", Toast.LENGTH_SHORT).show();        } else {            //只能使用内部存储器            Toast.makeText(this, "只能使用内部存储器", Toast.LENGTH_SHORT).show();        }

Environment包含常量:(用于判断外部存储设备的状态)
1. MEDIA_BAD_REMOVAL
表明SDCard 被卸载前己被移除
2.MEDIA_CHECKING
表明对象正在磁盘检查。
3.MEDIA_MOUNTED
表明对象是否存在并具有读/写权限
4. MEDIA_MOUNTED_READ_ONLY
表明对象权限为只读
5. MEDIA_NOFS
表明对象为空白或正在使用不受支持的文件系 统。
6. MEDIA_REMOVED
表明不存在 SDCard 返回
7. MEDIA_SHARED
表明SDCard 未安装 ,并通过 USB大容量存储共享返回
8.MEDIA_UNMOUNTABLE
表明SDCard不可被安装或SDCard 存在但不可以被安装
9.MEDIA_UNMOUNTED
表明SDCard已卸掉或SDCard是存在但是没有被安装

对于上面的外部存储器的状态,大部分是不需要掌握的,只需要记住上面的第三个状态:是否可读写状态。

如果能够读写就去做读写的操作,否则提示用户该功能无法操作。

(二)Environment 常用方法:

1.getDataDirectory()
获取Android 数据目录
2.getDownloadCacheDirectory()
获取 Android 下载/缓存内容目录。 3.getExternalStorageDirectory()
获取外部存储目录即 SDCard根目录位置,这个是要记住的。 4.getExternalStoragePublicDirectory(String type)
获取一个高端的公用的外部存储器目录来摆放某些类型的文件
5.getExternalStorageState()
获取外部存储设备的当前状态
6.getRootDirectory()
获取 Android的根目录

       上面这些目录可以只打印输出看看他们的区别,但是不要太注重表明的路径,因为不同的模拟器获手机对应的路径是用可能不同的,要多方面的去验证才好下结论。

       总的来说,Android外部文件的存储没什么知识,但是要记住的是要添加用户读取外部设备的权限,还要知道SD卡 的根路径的表达方式。

3 0