您的位置:华清远见教育科技集团 >> 新闻动态 >> Android资料 >> Android开发之文件外部存储  
 
Android开发之文件外部存储
分享到:

外部存储

在以前的文章中,我们介绍了使用Activity的openFileOutput()方法来保存文件,其保存的文件是存放在手机空间上,而一般手机的存储空间不是很大,存放些小文件还行,如果要存放像视频这样的大文件就存在困难。对于像视频这样的大文件,可以把它存放在SDCard。

SD卡(Secure Digital Memory Card)是Android的外部存储设备,是一种广泛使用于数码设备上的记忆卡。然而,SD卡中的文件为全局可访问的,而且可以被用户操作,因此,SD卡适用于保存大尺寸的文件或者是一些无须设置访问权限的文件,可以保存录制的大容量的视频文件和音频文件等。

Android系统提供了对SD卡便捷地访问方法。Android模拟器支持SD卡,可以使用以下两种方式来创建SD卡。

(1)使用<Android SDK>/tools目录下的mksdcard工具创建SD卡映像文件,命令如代码清单7-15所示。

代码清单7-15 创建SD卡映像文件


mksdcard -l SDCARD 256M E:\android\sdcard_file

该命令中,第1个参数-1表示后面的字符串是SD卡的标签,这个新建立的SD卡的标签是SDCARD;第2个参数256M表示SD卡的容量是256兆;后一个参数表示SD卡映像文件的保存位置,上面的命令将映像保存在E:\android目录下sdcard_file文件中。在CMD中执行该命令后,则可在所指定的目录中找到生产的SD卡映像文件。

如果希望Android模拟器启动时能够自动加载指定的SD卡,还需要在模拟器的“运行设置”(Run Configurations)中添加SD卡加载命令,而SD卡加载命令中只要指明映像文件位置即可。SD卡加载命令如图7-4所示。


图7-4 SD卡加载命令

那么如何测试SD卡映像是否正确加载呢?在模拟器启动后,使用FileExplorer向SD卡中随意上传一个文件,如果文件上传成功,则表明SD卡映像已经成功加载。

(2)在创建模拟器Android Virtual Device(AVD)时,自定义SD卡的大小,由系统来完成模拟器虚拟SD卡的创建,如图7-5所示。


图7-5 创建模拟器时选择SD卡大小

创建完成后,启动该模拟器,打开Eclipse的DDMS→File→Explorer,可以看到目录结构。

在加载SD卡后,需要通过编程来访问SD卡:首先需要在使用外部储存之前必须调用getExternalStorageState()方法来检查存储媒介是否可用来检测系统的/sdcard目录是否可用,如果不可用,则说明设备中的SD卡已经被移除或者被挂载到一台电脑上、遗失、只读或处于其他状态;在Android模拟器则表明SD卡映像没有被正确加载等;如果可用,则直接通过使用标准的Java.io.File类进行访问,将数据保存在SD卡。

检测SD卡是否可用的代码如代码清单7-16所示。

代码清单7-16 检验SD卡是否可用


boolean mExternalStorageAvailable = false;
    boolean mExternalStorageWriteable = false;
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        // 对SD卡上的存储可以进行读/写操作
        mExternalStorageAvailable = mExternalStorageWriteable = true;
    } else
    if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state))
    {
        //对SD卡上的存储可以进行读操作
        mExternalStorageAvailable = true;
        mExternalStorageWriteable = false;
    } else {
        //对SD卡上的存储不可用
        mExternalStorageAvailable = mExternalStorageWriteable = false;
    }

下面通过SDcardFileDemo示例说明如何将数据保存在SD卡。图7-6所示DcardFileDemo示例的用户界面。


图7-6 SDcardFileDemo示例的用户界面

在图7-6所示界面中,通过“生产随机数列”按钮生产10个随机小数;通过“写入SD卡”按钮将生产的数据保存在SD卡的目录下。SDcardFileDemo示例运行后,在每次单击“写入SD卡”按钮后,都会在SD卡中生产一个新文件,文件名各不相同。

SDcardFileDemo示例的核心代码如代码清单7-17所示。

代码清单7-17 SDcardFileDemo示例的核心代码


private static String randomNumbersString = "";
    OnClickListener writeButtonListener = new OnClickListener() {
        @Override
        public void onClick(View v) {
            String fileName = "SdcardFile-"+System.currentTimeMillis()+".txt";
            File dir = new File("/sdcard/");
            if (dir.exists() && dir.canWrite()) {
                File newFile = new File(dir.getAbsolutePath() + "/" + fileName);
                FileOutputStream fos = null;
                try {
                    newFile.createNewFile();
                    if (newFile.exists() && newFile.canWrite()) {
                        fos = new FileOutputStream(newFile);
                        fos.write(randomNumbersString.getBytes());
                        TextView labelView = (TextView)findViewById(R.id.label);
                        labelView.setText(fileName + "文件写入SD卡");
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (fos != null) {
                        try{
                            fos.flush();
                            fos.close();
                        }
                        catch (IOException e) { }
                    }
                }
            }
        }
    };

由上述代码可以看出,SDcardFileDemo示例与InternalFileDemo示例的核心代码比较相似,但SDcardFileDemo示例与InternalFileDemo示例也有不同之处:第7行代码中添加了/sdcard目录存在性检查;第8行代码使用“绝对目录+文件名”的形式表示新建立的文件;第12行代码写入文件前对文件存在性和可写入性进行检查;第5行代码为了保证在SD卡中多次写入时文件名不会重复,在文件名中使用了唯一且不重复的标识,这个标识通过调用System.currentTimeMillis()方法获得,表示从1970年00:00:00到当前所经过的毫秒数。

 更多相关文章

·Android开发之文件内部存储
·Android开发之数据共享(ContentProviders)
·Android开发之数据操作(SQLiteDatabase)
·Android开发之手动建立SQLite数据库
·Android开发之SharedPreferences数据存储方式