> 文档中心 > Android基础#45:Android数据存储之文件存储数据

Android基础#45:Android数据存储之文件存储数据

内容简介:

Android系统当然支持文件系统。在Android系统中,除了Preference文件外,普通的文件读取方式,和java几乎一样。需要注意的是,
Android系统中的文件的存储路径和读取权限。
Android系统中,既提供了App的私有的存储路径,也提供了诸如sdcard相关的公共路径的数据读取接口。例如,
openFileInput(),openFileOutput()方法,getCacheDir(),getExternalFilesDir等等,

示例:

这里,给出一些代码示例,分别针对内部存储器,外部存储器进行操作:
1. 内部数据存储器的操作例子,主要调用了openFileOutput, openFileInput。
 
  这组例子中,实现了下面三个函数:
  writeInternalStoragePrivate:写数据到内部存储器
  readInternalStoragePrivate: 从内部存储器读数据到指定的buffer中
  deleteInternalStoragePrivate:从内部存储器删除数据

/* 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); //将content数组的内容写到filename指定的文件中。        fos.close();    } catch (FileNotFoundException e) {        e.printStackTrace();    } catch (IOException e) {        e.printStackTrace();    }}//从内部私有存储器读取数据;注意 openFileInput() 的使用。/** * 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;}/** * Delete internal private file * @param filename - the filename to delete */public void deleteInternalStoragePrivate(String filename) {    File file = getFileStreamPath(filename);    if (file != null) {        file.delete();    }}

说明:

openFileInput(),openFileOutput()是ContextWrapper类的成员函数,所以可以直接在Activity中调用,因为Activity是ContextWrapper的子类。

2. 外部数据存储器的操作例子,主要用到了下面这些函数:
   getExternalStorageState()
   getExternalFilesDir()  
   getExternalStorageDirectory()
   getExternalStoragePublicDirectory()

   这组例子中,实现了下面几个函数:
   isExternalStorageAvailable: 外部存储器是否可用
   isExternalStorageReadOnly:  外部存储器是否只可读
   writeToExternalStoragePublic:写数据到外部存储器
   readExternallStoragePublic: 从外部存储器读数据到指定的buffer中
   deleteExternalStoragePublicFile:删除外部存储器代码:   

 

/** * 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;}/** * 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;}/** * 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();        }    }}/** * 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;}/** * 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:

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

相关方法:
getCacheDir: 得到内部高速缓存
getExternalCacheDir:得到外部高速缓存

代码:
 

/** * 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;       }/** * 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 cachedirectory */public String getExternalCacheDirectory() {    String extCacheDirPath = null;    File cacheDir = getExternalCacheDir();    if (cacheDir != null) {        extCacheDirPath = cacheDir.getPath();    }    return extCacheDirPath;    }

 

设计师字体大全