文件管理 内部存储 外部存储 Sdcard

文件管理:

1、内部存储操作

内部存储数据,是由本应用程序访问的私有数据,保存在/data/data/package_name/files/文件名  下
可以通过以下两个方法读取和写入私有数据:

<1>写入私有数据:

context.openFileOutput(name,mode)
name:自定义的文件名
mode:写入的模式:Context.MODE_PRIVATE 覆盖写入,Context.MODE_APPEND 追加写入
通常使用MODE_PRIVATE
由于不同的设备对手机每个应用的大小有限制,通过在几十M,所以,不建议把大量数据写入私有文件,
通常可以保存一些重要的用户数据(比如,密码等)

示例:
String info = "程序员好帅";
        try {
            BufferedOutputStream out = new BufferedOutputStream(openFileOutput("mly", Context.MODE_PRIVATE));
            out.write(info.getBytes());
            out.close();
            Toast.makeText(MainActivity.this, "write success", Toast.LENGTH_SHORT).show();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


<2>读取私入数据:

context.openFileInput(name)
name:已经存在的自定义文件名
示例:

 try {
            BufferedInputStream in = new BufferedInputStream(openFileInput("mly"));
            StringBuilder buf = new StringBuilder();
            byte[] bytes = new byte[1024*100];
            int len = -1;
            while((len=in.read(bytes))!=-1){
                buf.append(new String(bytes,0,len));
            }
            in.close();
            Toast.makeText(MainActivity.this, buf, Toast.LENGTH_SHORT).show();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }



<3>操作raw目录的文件(原生)res/raw

raw文件中资源文件的一种,只能读取,不能写入
可以存放一些声音资源文件


1>通常使用该资源实现数据的初始化工作:

在程序第一次运行时,读取该资源数据,执行相应的操作,比如(初始化数据库数据)
public void readRAWClick(View v){
       BufferedInputStream in = new BufferedInputStream(getResources().openRawResource(R.raw.sql));
        StringBuilder buf = new StringBuilder();
        byte[] bytes = new byte[1024];
        int len = -1;
        try {
            while((len=in.read(bytes))!=-1){
                buf.append(new String(bytes,0,len));
            }
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //读取到的SQL语句,再去执行
    }


2>实现文件的加密处理

在一个应用程序中,需要安装其它APK,通常会把这个APK文件与当前程序一起打包,在安装时同时安装这个APK,一些安全类APP可能扫描到这个而外安装的APK文件,以提醒用户,为了防止安全类应用扫描,我们会把这个APK文件进行加密处理,放到RAW资源目录中,在执行某一个操作时,读取这个加密文件,并生成(还原)APK,保存到SDCARD上,再执行安装操作
例如:
在实现支付操作时,需要安装支付插件,我们就把支付插件加密后保存在RAW目录中。


<3>asserts

存放资源文件,不会生成索引原生文件
通常在该目录下存放,网页文件、数据库数据文件、APK文件,不会受res资源的相关限制


<4>操作内部缓存目录:

系统在内存低的情况下,会自动清除缓存,但通常我们应该自己维护缓存
一般大小在1MB

Log.i("cache",getCacheDir().toString());
        try {
            //创建一个临时文件(前缀,后缀,文件目录)
            File file = File.createTempFile("mly","tmp",getCacheDir());
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
            bos.write("今天下雨了".getBytes());
            bos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }


<5>    外部存储(sdcard)

检查sdcard:

  
 public static boolean isExternalStorageWritable(){
        String state = Environment.getExternalStorageState();
        //判断是否存在外部存储设备(可写)
        if(Environment.MEDIA_MOUNTED.equals(state)){
           return true;
        }
        return false;

    }

    public static boolean isExternalStorageReadable() {
        String state = Environment.getExternalStorageState();
        //判断sdcard是否可读
        if (Environment.MEDIA_MOUNTED.equals(state) ||
                Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
            return true;
        }
        return false;
    }


获取sdcard的根目录:

 public static String getSDCardPath(){
        return Environment.getExternalStorageDirectory().getPath();
 }
  通配符:sdcard  



获取外部私有目录(4.4)

/**
     * 获取外部存储的私有目录(4.4)
     * @param context
     * @return
     */
    public static File getExternalFilesDir(Context context){
        File file = context.getExternalFilesDir(null);
        if(file==null){
            file = new File(Environment.getExternalStorageDirectory()+EXTERNAL_FILE_DIR);
        }
        return file;
    }

    /**
     * 获取外部存储的私有缓存目录(4.4)
     * @param context
     * @return
     */
    public static File getCacheDir(Context context){
        File file = context.getExternalCacheDir();
        if(file==null){
            file = new File(Environment.getExternalStorageDirectory()+EXTERNAL_CACHE_DIR);
        }
        return file;
    }

获取sdcard的总空间大小和可用空间大小
    /**
     * 获取sdcard的可用空间大小
     * @return
     */
    public static long getFreeSpace(){
        return Environment.getExternalStorageDirectory().getFreeSpace();
    }

    /**
     * 获取sdcard的总空间大小
     * @return
     */
    public static long getTotalSpace(){
        return Environment.getExternalStorageDirectory().getTotalSpace();
    }



获取sdcard上自带的指定目录:

//图片
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
//警报声音,闹钟声音
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_ALARMS)
//相机
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)
//文档
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS)
//下载
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
//视频
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)
//音乐
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC)
//通知
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_NOTIFICATIONS)
//博客
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PODCASTS)
//铃声
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES)


注意:
在实际开发中,我们通常会使用sdcard来作为本应用程序的缓存位置,我们可以在sdcard上创建一个
属于本应用程序使用的自定义目录(通过存放一些非敏感的数据)
敏感数据一般放在sdcard上的私有目录(sdcard/Andorid/data/package_name/...下,或
应用程序下的私有目录:data/data/package_name/files/...   或/cache/...)


面试题:问Android存储数据的方式有哪些:
Shared Preferences(共享属性文件)
Internal Storage(内部存储)
External Storage(外部存储)
SQLite Databases(SQLite数据库)
Network Connection(网络)


对sdcard的读写操作必须添加权限:

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





    
        
       
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值