4.3 SD卡文件操作

本节介绍Android的文件存储方式—— SD卡的用法,包括如何获取SD卡目录信息、在SD卡上读写文本文件、在SD卡读写图片文件等功能。

4.3.1 SD卡的基本操作

手机的存储空间一般分为两块,一块用于内部存储,另一块用于外部存储(SD卡)。早期的SD卡是可插拔式的存储芯片,不过自己买的SD卡质量参差不齐,经常会影响App的正常运行,所以后来越来越多手机把SD卡固化到手机内部,虽然拔不出来,但是Android仍然称之为外部存储。

获取手机上的SD卡信息通过Environment类实现,该类是App获取各种目录信息的工具,主要方法有以下7种。

● getRootDirectory:获得系统根目录的路径。

● getDataDirectory:获得系统数据目录的路径。

● getDownloadCacheDirectory:获得下载缓存目录的路径。

● getExternalStorageDirectory:获得外部存储(SD卡)的路径。

● getExternalStorageState:获得SD卡的状态。

状态的具体取值说明见表4-1。

表4-1 SD卡的存储状态取值说明

● getStorageState:获得指定目录的状态。

● getExternalStoragePublicDirectory:获得SD卡指定类型目录的路径。

目录类型的具体取值说明见表4-2。

表4-2 SD卡的目录类型取值说明

为正常操作SD卡,需要在AndroidManifest.xml中声明SD卡的权限,具体代码如下:

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

下面演示一下Environment类各方法的使用效果,如图4-10所示。页面上展示了Environment类获取到的系统及SD卡的相关目录信息。

图4-10 某设备上的SD卡目录信息

4.3.2 文本文件读写

文本文件的读写一般借助于FileOutputStream和FileInputStream。其中,FileOutputStream用于写文件,FileInputStream用于读文件。文件输出输入流是Java语言的基础工具,这里不再赘述,直接给出具体的实现代码:

            public static void saveText(String path, String txt) {
                try {
                    FileOutputStream fos = new FileOutputStream(path);
                    fos.write(txt.getBytes());
                    fos.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }


            public static String openText(String path) {
                String readStr = "";
                try {
                    FileInputStream fis = new FileInputStream(path);
                    byte[] b = new byte[fis.available()];
                    fis.read(b);
                    readStr = new String(b);
                    fis.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return readStr;
            }

文本文件的读写效果如图4-11所示。App把页面录入的注册信息保存到SD卡的文本文件中,接着进入文件列表读取页面,选中某个文本文件,页面就会展示该文件的文本内容,如图4-12所示。

图4-11 将注册信息保存到文本文件

图4-12 从文本文件读取注册信息

4.3.3 图片文件读写

Android的图片处理类是Bitmap,App读写Bitmap可以使用FileOutputStream和FileInputStream。不过在实际开发中,读写图片文件一般用性能更好的BufferedOutputStream和BufferedInputStream。

保存图片文件时用到Bitmap的compress方法,可指定图片类型和压缩质量;打开图片文件时使用BitmapFactory的decodeStream方法。读写图片的具体代码如下:

            public static void saveImage(String path, Bitmap bitmap) {
                try {
                    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(path));
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 80, bos);
                    bos.flush();
                    bos.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }


            public static Bitmap openImage(String path) {
                Bitmap bitmap = null;
                try {
                    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(path));
                    bitmap = BitmapFactory.decodeStream(bis);
                    bis.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return bitmap;
            }

接下来是演示时间,如图4-13所示,用户在注册页面录入注册信息,App调用getDrawingCache方法把整个注册界面截图并保存到SD卡;然后在另一个页面的图片列表选择SD卡上的指定图片文件,页面就会展示上次保存的注册界面图片,如图4-14所示。

图4-13 保存注册信息图片

图4-14 读取注册信息图片

刚才从SD卡读取图片文件用到了BitmapFactory的decodeStream方法,其实BitmapFactory还提供了其他方法,用起来更简单、方便,说明如下:

● decodeFile:该方法直接传文件路径的字符串,即可将指定路径的图片读取到Bitmap对象。

● decodeResource:该方法可从资源文件中读取图片信息。第一个参数一般传getResources(),第二个参数传drawable图片的资源id,如R.drawable.phone。