安卓学习日记——文件管理

1、使用内部存储器
2、使用外部存储器

  • 内部存储器
    你可以直接保存文件在设备的内部存储。默认情况下,文件保存在你的应用程序的内部存储,其他应用程序或用户不能访问。当用户卸载你的应用程序中,这些文件被删除。
    (一)在内部存储创建并写入私有文件:
    1、调用openFileOutput(name,model)方法,返回一个FileOutputStream,name参数用于指定文件名称,不能包含路径分隔符“/”,如果文件不存在,会自动创建它。创建的文件保存在/data/data//files/目录中,model参数指的是使用模式,分别有:
    MODE_PRIVATE:私有(创建此文件的应用能够使用,其他应用不能访问),写入文件会覆盖原来的内容
    MODE_APPEND:私有,在原来内容上增加数据
    MODE_WORLD_READABLE,MODE_WORLD_WRITEABLE :可以被其他应用读取或写入(API17版本中已废弃)不建议使用
    2、调用write方法把数据写入文件
    3、调用close方法关闭流

写入私有文件

public void writePrivateFileClick(View v){

        try {
            OutputStream out=openFileOutput("ska.txt", Context.MODE_PRIVATE);
            String info="我骄傲";
            byte[] bytes=info.getBytes();
            out.write(bytes,0,bytes.length);//写入
            out.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

安卓学习日记——文件管理
读取私有文件

public void readPrivateFileClick(View v){
        try {
            InputStream in=openFileInput("ska.txt");
            byte[] bytes=new byte[1024];
            StringBuffer sb=new StringBuffer();
            int len=-1;
            while((len=in.read(bytes))!=-1){

                sb.append(new String(bytes,0,len));
            }
            in.close();
            Toast.makeText(this,sb,Toast.LENGTH_SHORT).show();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

安卓学习日记——文件管理
读取raw文件
安卓学习日记——文件管理

 public void readRAWFileClick(View v){
        try {


        InputStream in=getResources().openRawResource(R.raw.sa);
        byte[] bytes=new byte[1024];
        StringBuffer sb=new StringBuffer();
        int len=-1;
        while((len=in.read(bytes))!=-1){
            sb.append(new String(bytes,0,len));
        }
        in.close();
        Toast.makeText(this,sb,Toast.LENGTH_SHORT).show();
    } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

效果展示
安卓学习日记——文件管理
写入私有缓存数据

public void writePrivateCahceDataClick(View v){
        try {
        //创建一个缓存文件
           File temp= File.createTempFile("temp",null,getCacheDir());
            FileOutputStream out=new FileOutputStream(temp);
            PrintStream ps=new PrintStream(out);
            ps.println("我可是要成为编程王的男人啊");
            ps.close();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

安卓学习日记——文件管理

  • 外部存储器
    所有兼容Android的设备都支持一个可共享的“外部存储(external storage)”,可用来保存文件。这可以使一个可移动的存储设备(比如SD卡)或者一个内部(不可移动的)存储。保存在外部存储的文件是可读的。并且当用于传输数据的USB大容量存储选项启用时,用户能够在计算机上修改它们。

访问SDcard路径
以前的Android(4.1之前的版本)中,SDcard路径通过“/sdcard”或者“/mnt/sdcard”来表示,而在Jelly Bean系统中修改为了“/storage/sdcard0”,以后可能还会有多个SDcard的情况。为了使代码更加健壮并能兼容以后的Android版本和新设备,请通过Environment.getExternalStorageDirectory().getPath()来获取sdcard路径。

public void isSDCardClick(View v){
        //判断是否有SDCard
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            Toast.makeText(this,"有SDCard",Toast.LENGTH_SHORT).show();
            if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY)){
                Toast.makeText(this,"SDCard只读",Toast.LENGTH_SHORT).show();
            }else {
                //sdcard路径
                System.out.println(Environment.getExternalStorageDirectory().getPath());
                //访问android内置的文件夹
                System.out.println(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS));
            }
        }
        else {
            Toast.makeText(this,"没有SDCard",Toast.LENGTH_SHORT).show();
        }
    }

安卓学习日记——文件管理
安卓学习日记——文件管理
(二)Saving files that are app-private(保护文件私有化)4.4版本(API 19)可用
为了文件的保密性,你必须保证自己的文件不让其他app读取。你可以使用getExternalFilesDir(type),type为null为默认。

再次注意,getExternalFilesDir(),这个方法,不一定总能够访问sd卡中的消息。
如果设备自身已经有了一部分内部存储当做外部存储,那这个方法就不能访问到sd。

当用户卸载应用程序,Android系统删除以下:
(1)你保存在内部存储的所有文件
(2)所有使用本应用外部存储的私有文件

(三)查询空闲空间
如果你事先知道要存储的数据量的大小,你就可以先查询一下可用空间有多少,这样就可以避免IOException,可用的方法是:
getFreeSpace()—返回剩余空间
getTotalSpace()—返回总空间
但是返回的可用空间大小,并不说明,你就可以存入那么多的数据。如果空间比你要存入的数据大几M,或者空间被占用率小于90%,都还可以,反之,就未必能存入。
并不需要每次存文件之前都来这么个判断,加个异常捕捉就OK。而且,你也未必知道你要存入的数据有多大,你想判断,也没法判断的,所以能catch这个IOEception就行。