android文件永久存储一共有两个位置,内部存储和外部存储,这里的存储是指ROM(断电仍保持记忆),不是运行内存(RAM断电记忆丢失)。

这是由现在android手机的存储结构决定的,内部存储就是焊在手机里的闪存空间的一部分,该部分是app的私有空间,没有root的话,其他软件无法读写该部分空间。焊在手机里的闪存一般分为4g,16g,32g,64g,128g,android的手机一般是4g,16g,32g,64g为多,苹果的手机一般是16g,64g,128g三种选择。

外部存储是除了上面提到的app私有的空间外,以及系统占用的一部分焊在手机里的闪存空间外部分存储空间,而且android手机由于手机用户自行选择插入sdcard这种情况造成了另一部分外部存储空间,如果像苹果那样不能自己插入sdcard,那么就不存在这样的外插sdcard外部存储这种情况.

android实际开发过程中会用到三个地方:

1、internal storage:内部储存,即app私有空间,绝对路径为 “/data/data/app-package-name/”,这部分物理上可以理解为焊在手机里的闪存空间部分存储空间。

     在该目录下会自动创建目录:files,cache,databases,lib,shared_prefs;这些目录因app中产生数据的存储需求而创建,app中没有产生存储需求就可能不产生这些文件夹中的部分。

2、external storage:外部存储空间:焊在手机里的闪存空间的部分,一般绝对路径为:/mnt/shell/emulated/0/(不同系统会有微小的区别,但是对于调用系统提供的函数获得路径而言,这样的区别对编程没有影响),一般该路径可以通过“file:///sdcard/xxx”获得,文件xxx就储存在“/mnt/shell/emulated/0/”目录下。

3、sdcard:外部存储空间,用户自己插入的sdcard,该空间不一定总是存在,所以使用之前需要程序判断是否插入了外部sdcard,外插sdcard根目录的绝对地址为:“/storage/sdcard1/”


为了简化操作,我们只将数据保存在内部存储空间 和 外部存储空间( 焊在手机里),我们可以只将“/data”目录下的存储空间认为是内部存储空间,/mnt/shell/emulated/0 目录下的空间认为是外部存储空间;而且外部存储空间的也分公用的,和私有的

主要参考:http://www.androidchina.net/4106.html

internal storage /data 由于内部存储空间有限,在开发中我们一般都是操作外部存储空间,Google官方建议我们App的数据应该存储在外部存储的私有
目录中该App的包名下,这样当用户卸载掉App之后,相关的数据会一并删除,如果你直接在/storage/sdcard目录下创建了一个应
用的文件夹,那么当你删除应用的时候,这个文件夹就不会被删除。
external storage /mnt/shell/emulated/0 私有:/mnt/shell/emulated/0/Android/data/app_package_name/files
          /mnt/shell/emulated/0/Android/data/app_package_name/cache

公用:九大公有目录,比如DCIM、DOWNLOAD等这种系统为我们创建的文件夹
sdcard /storage/sdcard1/  

    

我们的app在使用空间的路径时,应该使用绝对路径,而不是相对路径,关于绝对路径和相对路径,参考:http://blog.csdn.net/androidwifi/article/details/17725989

下面这些函数的方法获得的都是

1、getFilesDir()  = /data/data/com.gsh.gshow/files

2、getExternalFilesDir().getAbsolutePath()  = /storage/emulated/0/Android/data/com.gsh.gshow/files

3、Environment.getDownloadCacheDirectory().getAbsolutePath()  =  /cache

4、Environment.getDataDirectory().getAbsolutePath() = /data

5、Environment.getExternalStorageDirectory().getAbsolutePath() = /storage/emulated/0  (->/mnt/shell/emulated/0)

6、Environment.getExternalStoragePublicDirectory("pub_test")  = /storage/emulated/0


下面这个类操作的就是External storage:

public class SDCardHelper {      // 判断SD卡是否被挂载     public static boolean isSDCardMounted() {         // return Environment.getExternalStorageState().equals("mounted");         return Environment.getExternalStorageState().equals(         Environment.MEDIA_MOUNTED);    }     // 获取SD卡的根目录    public static String getSDCardBaseDir() {         if (isSDCardMounted()) {               return Environment.getExternalStorageDirectory().getAbsolutePath();         }         return null;    }     // 获取SD卡的完整空间大小,返回MB    public static long getSDCardSize() {         if (isSDCardMounted()) {              StatFs fs = new StatFs(getSDCardBaseDir());              long count = fs.getBlockCountLong();              long size = fs.getBlockSizeLong();              return count * size / 1024 / 1024;         }         return 0;    }     // 获取SD卡的剩余空间大小    public static long getSDCardFreeSize() {         if (isSDCardMounted()) {               StatFs fs = new StatFs(getSDCardBaseDir());               long count = fs.getFreeBlocksLong();               long size = fs.getBlockSizeLong();               return count * size / 1024 / 1024;         }         return 0;    }     // 获取SD卡的可用空间大小    public static long getSDCardAvailableSize() {         if (isSDCardMounted()) {               StatFs fs = new StatFs(getSDCardBaseDir());               long count = fs.getAvailableBlocksLong();               long size = fs.getBlockSizeLong();               return count * size / 1024 / 1024;         }         return 0;    }     // 往SD卡的公有目录下保存文件    public static boolean saveFileToSDCardPublicDir(byte[] data, String type, String fileName) {         BufferedOutputStream bos = null;         if (isSDCardMounted()) {               File file = Environment.getExternalStoragePublicDirectory(type);               try {                    bos = new BufferedOutputStream(new FileOutputStream(new File(file, fileName)));                    bos.write(data);                    bos.flush();                    return true;               } catch (Exception e) {                    e.printStackTrace();               } finally {                    try {                          bos.close();                    } catch (IOException e) {                          // TODO Auto-generated catch block                          e.printStackTrace();                    }               }          }          return false;     }      // 往SD卡的自定义目录下保存文件     public static boolean saveFileToSDCardCustomDir(byte[] data, String dir, String fileName) {          BufferedOutputStream bos = null;          if (isSDCardMounted()) {                File file = new File(getSDCardBaseDir() + File.separator + dir);                if (!file.exists()) {                      file.mkdirs();// 递归创建自定义目录                }                try {                      bos = new BufferedOutputStream(new FileOutputStream(new File(file, fileName)));                      bos.write(data);                      bos.flush();                      return true;                } catch (Exception e) {                      e.printStackTrace();                } finally {                      try {                            bos.close();                      } catch (IOException e) {                            // TODO Auto-generated catch block                            e.printStackTrace();                      }                }           }           return false;     }      // 往SD卡的私有Files目录下保存文件     public static boolean saveFileToSDCardPrivateFilesDir(byte[] data, String type, String fileName, Context context) {         BufferedOutputStream bos = null;         if (isSDCardMounted()) {               File file = context.getExternalFilesDir(type);               try {                      bos = new BufferedOutputStream(new FileOutputStream(new File(file, fileName)));                      bos.write(data);                      bos.flush();                      return true;               } catch (Exception e) {                      e.printStackTrace();               } finally {                      try {                            bos.close();                      } catch (IOException e) {                            // TODO Auto-generated catch block                            e.printStackTrace();                      }               }          }          return false;     }      // 往SD卡的私有Cache目录下保存文件     public static boolean saveFileToSDCardPrivateCacheDir(byte[] data, String fileName, Context context) {          BufferedOutputStream bos = null;          if (isSDCardMounted()) {                File file = context.getExternalCacheDir();                try {                      bos = new BufferedOutputStream(new FileOutputStream(new File(file, fileName)));                      bos.write(data);                      bos.flush();                      return true;                } catch (Exception e) {                      e.printStackTrace();                } finally {                      try {                            bos.close();                      } catch (IOException e) {                            // TODO Auto-generated catch block                            e.printStackTrace();                      }               }          }          return false;     }      // 保存bitmap图片到SDCard的私有Cache目录     public static boolean saveBitmapToSDCardPrivateCacheDir(Bitmap bitmap, String fileName, Context context) {          if (isSDCardMounted()) {                BufferedOutputStream bos = null;                // 获取私有的Cache缓存目录                File file = context.getExternalCacheDir();                 try {                       bos = new BufferedOutputStream(new FileOutputStream(new File(file, fileName)));                       if (fileName != null && (fileName.contains(".png") || fileName.contains(".PNG"))) {                              bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos);                       } else {                              bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);                       }                       bos.flush();                } catch (Exception e) {                       e.printStackTrace();                } finally {                       if (bos != null) {                            try {                                 bos.close();                            } catch (IOException e) {                                 e.printStackTrace();                            }                       }                 }                 return true;          } else {                return false;          }     }      // 从SD卡获取文件     public static byte[] loadFileFromSDCard(String fileDir) {          BufferedInputStream bis = null;          ByteArrayOutputStream baos = new ByteArrayOutputStream();           try {                bis = new BufferedInputStream(new FileInputStream(new File(fileDir)));                byte[] buffer = new byte[8 * 1024];                int c = 0;                while ((c = bis.read(buffer)) != -1) {                     baos.write(buffer, 0, c);                     baos.flush();                }                return baos.toByteArray();          } catch (Exception e) {                e.printStackTrace();          } finally {                try {                     baos.close();                     bis.close();                } catch (IOException e) {                     e.printStackTrace();                }          }          return null;     }      // 从SDCard中寻找指定目录下的文件,返回Bitmap     public Bitmap loadBitmapFromSDCard(String filePath) {          byte[] data = loadFileFromSDCard(filePath);          if (data != null) {               Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);               if (bm != null) {                     return bm;               }          }          return null;     }      // 获取SD卡公有目录的路径     public static String getSDCardPublicDir(String type) {          return Environment.getExternalStoragePublicDirectory(type).toString();     }      // 获取SD卡私有Cache目录的路径     public static String getSDCardPrivateCacheDir(Context context) {          return context.getExternalCacheDir().getAbsolutePath();     }      // 获取SD卡私有Files目录的路径     public static String getSDCardPrivateFilesDir(Context context, String type) {          return context.getExternalFilesDir(type).getAbsolutePath();     }      public static boolean isFileExist(String filePath) {          File file = new File(filePath);          return file.isFile();     }      // 从sdcard中删除文件     public static boolean removeFileFromSDCard(String filePath) {          File file = new File(filePath);          if (file.exists()) {               try {                     file.delete();                     return true;               } catch (Exception e) {                     return false;               }          } else {               return false;          }     }}



更多相关文章

  1. 2015.4.28 北京未名空间信息技术有限公司
  2. ArcGIS for Android(安卓)离线数据空间分析--叠加分析
  3. Android模仿QQ空间图片上传——原理
  4. Android(安卓)获取存储空间
  5. android studio 构建maven私有库环境搭建
  6. android——api
  7. [Android(安卓)SQLite]数据存储与访问 - 内部存储
  8. libgdx的使用--环境搭建测试
  9. 详解Android(安卓)9.0 私有API禁用机制

随机推荐

  1. 大虾们的 android 浅谈
  2. Android画图学习总结(一)——类的简介
  3. Android调用WebService系列之KSoap2对象
  4. android学习笔记(2)---第一个Android应用程
  5. Android撬动IT市场的新支点
  6. 如何在eclipse的android工程里引用androi
  7. Android缺乏整体控制或成发展障碍
  8. Google 的设计主管谈开发中的 Ice Cream
  9. java和Android都是新手,想学Android,怎样入
  10. Android(安卓)蓝牙开发(整理大全)