`
crazier9527
  • 浏览: 1008499 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 本地数据存储 API(三)(转)

阅读更多

为私有数据使用设备的内部存储器

有了数据存储 API,您可以使用内部存储器存储数据。信息可以是私有的,您可以有选择地让其他应用程序对之具有读或写的访问权限。本节介绍这个存储私有数据的 API,它使用 android.content.Context.openFileInputopenFileOutput 和 getCacheDir() 来高速缓存数据,而不是永久地存储。

清单 20 中的代码片段展示了如何从内部私有存储器读取数据。使得存储器为私有的方法是对 openFileOutput() 使用MODE_PRIVATE


清单 20. 从本地私有存储器读取数据

    
/**
 * Writes content to internal storage making the content private to 
 * the application. The method can be easily changed to take the MODE 
 * as argument and let the caller dictate the visibility: 
 * MODE_PRIVATE, MODE_WORLD_WRITEABLE, MODE_WORLD_READABLE, etc.
 * 
 * @param filename - the name of the file to create
 * @param content - the content to write
 */
public void writeInternalStoragePrivate(
        String filename, byte[] content) {
    try {
        //MODE_PRIVATE creates/replaces a file and makes 
        //  it private to your application. Other modes:
        //    MODE_WORLD_WRITEABLE
        //    MODE_WORLD_READABLE
        //    MODE_APPEND
        FileOutputStream fos = 
           openFileOutput(filename, Context.MODE_PRIVATE);
        fos.write(content);
        fos.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}


 

清单 21 中的代码片段展示了如何从内部私有存储器读取数据;注意 openFileInput() 的使用。


清单 21. 从内部私有存储器读取数据

    
/**
 * Reads a file from internal storage
 * @param filename the file to read from
 * @return the file content
 */
public byte[] readInternalStoragePrivate(String filename) {
    int len = 1024;
    byte[] buffer = new byte[len];
    try {
        FileInputStream fis = openFileInput(filename);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int nrb = fis.read(buffer, 0, len); // read up to len bytes
        while (nrb != -1) {
            baos.write(buffer, 0, nrb);
            nrb = fis.read(buffer, 0, len);
        }
        buffer = baos.toByteArray();
        fis.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return buffer;
}


清单 22 展示了如何从内部私有存储器删除数据。


清单 22. 从本地私有存储器删除数据

    
/**
 * Delete internal private file 
 * @param filename - the filename to delete
 */
public void deleteInternalStoragePrivate(String filename) {
    File file = getFileStreamPath(filename);
    if (file != null) {
        file.delete();
    }
}


现在可以来看为公共数据使用外部存储器了。

为公共数据使用设备的外部存储器

有了数据存储 API,您可以使用外部存储器存储数据。信息可以是私有的,您可以有选择地让其他应用程序对之具有读或写的访问权限。本节您将对此 API 进行编程,以便使用包括getExternalStorageState()getExternalFilesDir()getExternalStorageDirectory() 和getExternalStoragePublicDirectory() 在内的很多 API 来存储公共数据。您为公共数据使用下面的路径:/Android/data/<package_name>/files/

在使用外部存储器之前,必须看看它是否可用,是否可写。下面两个代码片段展示了测试这些条件的帮助器方法。清单 23 测试外部存储器是否可用。


清单 23. 测试外部存储器是否可用

    
/**
 * Helper Method to Test if external Storage is Available
 */
public boolean isExternalStorageAvailable() {
    boolean state = false;
    String extStorageState = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(extStorageState)) {
        state = true;
    }
    return state;
}


清单 24 测试外部存储器是否只可读。


清单 24. 测试外部存储器是否只可读

    
/**
 * Helper Method to Test if external Storage is read only
 */
public boolean isExternalStorageReadOnly() {
    boolean state = false;
    String extStorageState = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(extStorageState)) {
        state = true;
    }
    return state;
}


清单 25 展示了如何写到外部存储器,以存储公共数据。


清单 25. 写到外部内存

    
/**
 * Write to external public directory
 * @param filename - the filename to write to
 * @param content - the content to write 
 */
public void writeToExternalStoragePublic(String filename, byte[] content) {

    // API Level 7 or lower, use getExternalStorageDirectory() 
    //  to open a File that represents the root of the external 
    // storage, but writing to root is not recommended, and instead 
    // application should write to application-specific directory, as shown below.

    String packageName = this.getPackageName();
    String path = "/Android/data/" + packageName + "/files/";

    if (isExternalStorageAvailable() && 
       !isExternalStorageReadOnly()) {
        try {
            File file = new File(path, filename);
            file.mkdirs();
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(content);
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


清单 26 展示了如何从外部存储器读取数据。


清单 26. 从外部内存读取数据

    
/**
 * Reads a file from internal storage
 * @param filename - the filename to read from
 * @return the file contents
 */
public byte[] readExternallStoragePublic(String filename) {
    int len = 1024;
    byte[] buffer = new byte[len];
    String packageName = this.getPackageName();
    String path = "/Android/data/" + packageName + "/files/";

    if (!isExternalStorageReadOnly()) {     
        try {
            File file = new File(path, filename);            
            FileInputStream fis = new FileInputStream(file);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int nrb = fis.read(buffer, 0, len); //read up to len bytes
            while (nrb != -1) {
                baos.write(buffer, 0, nrb);
                nrb = fis.read(buffer, 0, len);
            }
            buffer = baos.toByteArray();
            fis.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return buffer;
}


清单 27 中的代码片段展示了如何从外部内存删除文件。


清单 27. 从外部内存删除文件

    
/**
 * Delete external public file 
 * @param filename - the filename to write to
 */
void deleteExternalStoragePublicFile(String filename) {
    String packageName = this.getPackageName();
    String path = "/Android/data/" + packageName + "/files/"+filename;
    File file = new File(path, filename);
    if (file != null) {
        file.delete();
    }
}


处理外部存储器需要特殊的权限 WRITE_EXTERNAL_STORAGE,它通过 AndroidManifest.xml 请求得到(参见 清单 28)。


清单 28. WRITE_EXTERNAL_STORAGE

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


外部存储 API 通过根据文件类型(比如 Pictures、Ringtones)将文件存储在预先确定的目录中,允许您公共地存储文件。本文没有介绍这种方法,但是您应该熟悉它。此外,记住外部存储器中的文件任何时候都可能消失。

相关的方法

如果您具有不需要长期永久保存的临时文件,那么可以将这些文件存储在高速缓存中。高速缓存是一种特殊的内存,可以用于存储中小型数据(少于兆字节),但是您一定要知道,取决于有多少内存可用,高速缓存的内容任何时候都可能被清除。

清单 29 展示了一个帮助器方法,它返回到内部内存中高速缓存的路径。


清单 29. 检索到内部内存高速缓存的路径

    
/**
 * Helper method to retrieve the absolute path to the application 
 * specific internal cache directory on the file system. These files 
 * will be ones that get deleted when the application is uninstalled or when 
 * the device runs low on storage. There is no guarantee when these 
 * files will be deleted.
 * 
 * Note: This uses a Level 8+ API.
 * 
 * @return the absolute path to the application specific cache 
 * directory
 */
public String getInternalCacheDirectory() {
    String cacheDirPath = null;
    File cacheDir = getCacheDir();
    if (cacheDir != null) {
        cacheDirPath = cacheDir.getPath();
    }
    return cacheDirPath;        
}


清单 30 展示了一个帮助器方法,它返回到外部内存中高速缓存的路径。


清单 30. 检索到外部内存高速缓存的路径

    
/**
 * Helper method to retrieve the absolute path to the application 
 * specific external cache directory on the file system. These files 
 * will be ones that get deleted when the application is uninstalled or when 
 * the device runs low on storage. There is no guarantee when these 
 * files will be deleted.
 * 
 * Note: This uses a Level 8+ API.
 * 
 * @return the absolute path to the application specific cache 
 * directory
 */
public String getExternalCacheDirectory() {
    String extCacheDirPath = null;
    File cacheDir = getExternalCacheDir();
    if (cacheDir != null) {
        extCacheDirPath = cacheDir.getPath();
    }
    return extCacheDirPath;     
}

 



通过使用示例应用程序,您现在应该很好地理解了如何为公共数据使用设备的外部存储器。

 

感谢http://hi.baidu.com/304580500/blog/item/538a5bb0f4a6ce4008230244.html

 

分享到:
评论

相关推荐

    Android本地数据存储之文件存储读写

    在Android应用开发中,本地数据存储是至关重要的一个环节,特别是在处理用户数据或者应用程序需要持久化数据时。本文将深入探讨Android系统中的文件存储机制,包括如何读取、写入、重写和删除.txt格式的文件。理解...

    Android官方中文翻译API文档

    4. **数据存储**:Android提供了多种数据存储方式,如SharedPreferences(键值对存储)、SQLite数据库、文件系统和ContentProvider。 5. **网络编程**:涉及HttpURLConnection、OkHttp等网络库,以及Android的...

    Android本地数据存储之SQLite增删改查

    在Android应用开发中,本地数据存储是至关重要的,SQLite数据库作为一种轻量级的数据库系统,被广泛用于存储和管理应用程序中的结构化数据。本篇文章将深入探讨如何在Android中使用SQLite进行基本的增删改查操作,以...

    Android 写入数据到本地ExcelDemo

    在Android开发中,将数据写入到本地Excel文件是一个常见的需求,这通常涉及到对数据的存储和导出功能。在本教程中,我们将探讨如何在Android应用中实现这个功能,主要涉及的技术点包括使用第三方库Apache POI以及...

    Android数据储存

    一、Android数据存储方式 1. SharedPreferences:适用于存储少量的键值对数据,如用户设置。它是一种轻量级的存储方案,数据以XML格式存储在磁盘上,易于读写。 2. 文件存储:可以创建自定义格式的文件来保存数据...

    Android平板本地数据excel的导入导出

    在Android平台上,对本地数据进行Excel的导入与导出是一项常见的需求,特别是在处理表格类数据时。本篇文章将深入探讨如何在Android平板上实现这一功能,主要涉及Android应用开发、Excel处理以及数据存储的相关知识...

    Android-API大全

    11. **SQLite**:Android内置轻量级的SQLite数据库系统,用于本地数据存储。它支持SQL语句,方便进行数据操作。 12. **AsyncTask**和**Thread**:用于在后台线程执行耗时任务,避免阻塞主线程,提高应用性能。 13....

    ArcGIS for Android 本地数据和 谷歌图层

    **ArcGIS for Android 本地数据和谷歌图层详解** ArcGIS for Android 是一款强大的地理信息系统(GIS)开发框架,专为Android平台设计,允许开发者创建具有地图显示、地理数据分析和地理处理功能的应用程序。在2.0...

    android数据存储ppt课件及Demo

    在Android开发中,数据存储是不可或缺的一部分,它允许应用程序持久保存数据,以便在用户退出应用后还能恢复状态或在后续使用中访问数据。本资源"android数据存储ppt课件及Demo"提供了一个全面学习Android数据存储的...

    Android 本地文件的存储和读取

    以上是Android本地文件存储和读取的基本知识点。通过熟练掌握这些技术,开发者可以更好地处理应用中的数据持久化,提高用户体验。在实际开发中,还应结合具体需求,选择合适的数据结构和文件格式,以实现高效且安全...

    Android APIs Reference API Level1~API Level19离线版

    API Level 8(Froyo)开始支持SQLite数据库的升级,让数据存储更加灵活。API Level 10(Gingerbread)加强了对蓝牙2.1的支持,提升了设备间的数据传输效率。 API Level 11(Honeycomb)是专为平板电脑设计的版本,...

    Android官方API文档完整版2017

    这份文档覆盖了Android开发的各个方面,包括系统服务、UI框架、多媒体支持、网络通信、数据存储等。以下是基于这个文档及其内容的一些关键知识点: 1. **Android SDK**:SDK(Software Development Kit)是Android...

    Android-知乎专栏API分析第三方知乎专栏Android客户端

    总的来说,"Android-知乎专栏API分析第三方知乎专栏Android客户端"涵盖了Android开发的多个关键点,包括网络请求、数据解析、UI设计、数据存储、性能优化和测试策略等,是一个全面学习Android开发的实践项目。...

    安卓Android源码——安卓Android学习——数据存储.rar

    在安卓(Android)系统中,数据存储是应用开发不可或缺的一部分,它允许应用程序持久化数据,以便在用户退出或设备重启后仍然能够访问。本压缩包文件"安卓Android源码——安卓Android学习——数据存储.rar"显然是...

    Android应用数据的储存与读取_安卓源码.zip

    本教程将详细讲解Android中常见的数据存储方式,并通过提供的源码进行实例解析。 1. SharedPreferences SharedPreferences是Android中最简单的数据存储方式,常用于存储轻量级、配置类的数据,如用户偏好设置。它...

    最新Android apidemos

    3. **数据存储**:包括SQLite数据库操作、SharedPreferences设置、ContentProvider使用,以及最近的Room数据库框架。这些都是Android应用持久化数据的重要方式。 4. **网络通信**:涵盖了HTTP请求(如使用...

    Android官方API文档完整版

    SQLite是轻量级的关系型数据库,适用于本地数据存储;SharedPreferences用于存储简单的键值对;ContentProvider则用于跨应用数据共享。 5. **网络通信**: Android API提供了`HttpURLConnection`、`HttpClient`...

    AndroidAPI之数据储存[定义].pdf

    Android API提供了多种数据储存方式,以适应不同的需求和场景。 1. **Shared Preferences**:这是一种用于存储轻量级、私有数据的机制,通常用于保存用户的设置或者简单偏好。Shared Preferences是以键值对的形式...

    android获取本地图片相册及图片

    总的来说,"android获取本地图片相册及图片"涉及的知识点包括:Android文件系统与权限管理、MediaStore API的使用、图片加载库的运用(如Glide)、多选功能的实现以及Intent的使用。开发者需要熟练掌握这些技术,...

    Android、Java、Js等API

    - `Android中文翻译组——Android中文API——android.widget合集(中).chm` 虽然主要是关于Android的,但可能包含了一些与SQLite数据库相关的API,因为Android设备上的本地数据存储常使用SQLite。 5. **Android ...

Global site tag (gtag.js) - Google Analytics