Android学习——文件管理

文件管理

1.使用内部存储器

你可以直接保存文件在设备的内部存储。默认情况下,文件保存在你的应用程序的内部存储,其他应用程序或用户不能访问。当用户卸载你的应用程序中,这些文件被删除。
(一)在内部存储创建并写入私有文件:

1、调用openFileOutput(name,model)方法(打开私有文件输出流),返回一个FileOutputStream,name参数用于指定文件名称,不能包含路径分隔符 “/”,如果文件不存在,会自动创建它。创建的文件保存在/data/data/< package name>/files/目录中,model参数指的是使用模式,分别有:

MODE_ PRIVATE :私有(创建此 文件的应用能够使用,其他应用不能访问),写入文件会覆盖原来的内容。
MODE_ APPEND ;私有,在原有内容上增加数据。
MODE WORLD READABLE, MODE WORLD WRITEABLE :可以被其他应用读取或写入(API17版本中已废弃)不建议使用。

2、调用write方法杷数据写入文件
3、调用close方法 关闭流
在这里插入图片描述

package com.example.files;

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    //写入私有文件
    public void writePrivateFileClick(View v){
        try {
            OutputStream outputStream = openFileOutput("PrivateFile.txt", Context.MODE_APPEND);
            String info="写入私有文件";
            byte[] bytes=info.getBytes();
            outputStream.write(bytes,0,bytes.length);
            outputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

在这里插入图片描述在这里插入图片描述
使用MODE_ APPEND
在这里插入图片描述
(二)读取内部存储的私有文件:

1、调用openFilelnput(name)方法,返回一个FilelnputStream, name指的是文件名
2、调用read方法读取文件字节
3、调用close方法关闭流

//读取私有文件
public void readPrivateFileClick(View v){
    try {
        InputStream inputStream=openFileInput("PrivateFile.txt");
        byte[] bytes=new byte[1024];
        StringBuffer stringBuffer=new StringBuffer();
        int len=-1;
        while ((len= inputStream.read(bytes))!=-1){
            stringBuffer.append(new String(bytes,0,len));
        }
        inputStream.close();
        Toast.makeText(this, stringBuffer, Toast.LENGTH_SHORT).show();
        textView.setText(stringBuffer);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

在这里插入图片描述
注意:
如果想要访问res/raw/目录下的原生文件,可以通过openRawResource(),传入R.raw. < filename>资料ID,就可以返回一个InputStream,该文件为只读文件,不能对其执行写入操作。

//读取原生文件
public void readRAWFileClick(View v){
    try {
        InputStream inputStream=getResources().openRawResource(R.raw.file);
        byte[] bytes=new byte[1024];
        StringBuffer stringBuffer=new StringBuffer();
        int len=-1;
        while ((len=inputStream.read(bytes))!=-1){
            stringBuffer.append(new String(bytes,0,len));
        }
        inputStream.close();
        Toast.makeText(this, stringBuffer, Toast.LENGTH_SHORT).show();
        textView.setText(stringBuffer);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

在这里插入图片描述
(三)保存内部缓存文件

如果你想缓存一些数据,而不是永久保存,可以使用getCacheDir0)打开文件所在的目录, 代表内部应用程序应保存临时缓存文件。

当设备的内部存储空间低,Android可以删除这些缓存文件以回收空间。然而,你不应该依赖系统来为你清除这些文件。你应该自己维护缓存文件,并保持在一个合理的消耗空间的限制,如1MB。 当用户卸载你的应用程序,这些文件被删除。通过getCacheDir()获取的目录为: /data/data/< package name>/cache

在这里插入图片描述

//写入一个缓存文件
    public void writePrivatCahceDataClick(View v){
//        String temp= getCacheDir() + "/temp.tmp";
        try {
            //创建一个缓存的文件
            File temp=File.createTempFile("temp","",getCacheDir());
            FileOutputStream outputStream=new FileOutputStream(temp);
            PrintStream printStream=new PrintStream(outputStream);
            printStream.print("此刻打盹,你将做梦;此刻学习,你将圆梦。");
            printStream.close();
            outputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

在这里插入图片描述在这里插入图片描述
(四)其他有用的方法
getFilesDir():
获取私有的文件目录:/data/data/< package name>/files
getDir():
创建(或打开已存在的)目录:/data/data/< package name>/app_<文件名>
deleteFile(name)
删除私有目录的文件:/data/data/< package name>/files
fileList():
获取/data/data/< package name>/files目录的文件名数组

2.使用外部存储器

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

(一)获取外部存储权限
为了在外部存储读或写文件,必须要获得android.pernission.READ_ EXTERNAL STORAGE 或 android. permission.WRITE_ EXTERNAL. STORAGE系统权限,例如: <manifest …>
<uses-permission android:name-'android permission.WRITE_ EXTERNAL_ STORAGE" />

< /manifest>

即要读也要写权限,只须添加WRITE EXTERNAL. STORAGE即可。

注意:
在4.4中,如果这些外部是私有化的,你可以不需要添加这些权限的后续介绍。

(二)检查媒体的可用性

在使用外部存储来保存数据时,我们应该使用getExternalStorageState0来检查当前设备是否存在外鄂存储设备(SDCard) ,否则将会发生意外。
例如:

public boolean isExternalStorageWritable() {

      String state = Environment getExternalStorageStatel);

      if (Environment.MEDIA_ MOUNTED.equalslstatel) {return true;}return false;}

      public boolean isExternalStorageReadable() {

      String state = Environment.getExtermalStorageState0:if (Environment.MEDIA_ MOUNTED.equals(state) II

      Environment.MEDIA_ MOUNTED_ READ ONLY equals(statel) {return true;}return false;}

(三)访问SDcard路径

以前的Android(4.1之前的版本)中,SDcard路径通过"/sdcard" 或者"/mnt/sdcard"来表示,而在Jelly Bean系统中修改为了"/storage/sdcard0",以后可能还会有多个SDcard的情况。目前为了保持和之前代码的兼容,sdcard路径做 了link映射。

为了使代码更加健壮并能兼容以后的Android版本和新设备,请通过Environment getExternalStorageDirectory().getPath()来获取sdcard路径。

如果您需要往sdcard中保存特定类型的内容,可以考虑使用Environment.getExternalStoragePublicDirectory(String type)函数,该函数可以返回特定类型的目录,目前支持如下类型:

  • DIRECTORY ALARMS //警报的铃声
  • DIRECTORY_ DCIM //相机相摄的图片和视频保存的位置
  • DIRECTORY_ DOWNLOADS //下载文件保存的位置
  • DIRECTORY MOVIES //电影保存的位置, 比如通过google play下载的电影
  • DIRECTORY MUSIC//音乐保存的位置
  • DIRECTORY_ NOTIFICATIONS //通知音保存的位置
  • DIRECTORY_ PICTURES //下载的图片保存的位置
  • DIRECTORY PODCASTS //用于保存podcast(f博客)的音频文件
  • DIRECTORY_ RINGTONES//保存铃声的位置

根据这些参数系统会自动扫描,并整理到对应的目录中。

public void isSDCardClick(View v){
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            Toast.makeText(this, "有SD卡", Toast.LENGTH_SHORT).show();
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY)){
                Toast.makeText(this, "SD卡只读", 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, "没有SD卡", Toast.LENGTH_SHORT).show();
        }
    }

在这里插入图片描述在这里插入图片描述

(四) Saving files that are app-private (保存文件私有化) 4.4版本(API 19)可用

为了文件的保密性,你必须保证自己的文件不让其他app读取。你可以使用getExteralFilesDirltype(type)为null为默认。

再次注意,getExternalFilesDir()这个方法,不一定总能够访问sd卡中的信息。

如果设备自身已经有了一部分内部存储当做外部存储,那这个方法就不能访问到sd卡。

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

(五)外部存储保存私有缓存文件

通过Context.getExternalFilesDir(方法可以获取到SDCard/Android/data/你的应用的包名/files/目录,一般放一些长时间保存的数据

通过Context. getExternalCacheDir)方法可以获取到SDCard/Android/data/你的应用包名/cache/目录,-般存放临时缓存数据

如果使用,上面的方法,当你的应用在 被用户卸载后,SDCard/Android/data/你的应用的包名/ 这个目录下的所有文件都会被删除,不会留下垃圾信息。

而且上面二个目录分别对应设置->应用- >应用详情里面的"清除数据"与”清除缓存”选项

在这里插入图片描述

public void writeSDCardPrivateFileClick(View v){
        File file = getExternalFilesDir(null);
        if (file!=null){
            try {
                FileOutputStream outputStream=new FileOutputStream(file+"/file.txt");
                PrintStream printStream=new PrintStream(outputStream);
                printStream.print("good good study,day day up");
                printStream.close();
                outputStream.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

//写入SD卡私有缓存文件
    public void writeSDCardPrivateCacheFileClick(View v){
        try {
            File temp=File.createTempFile("file",null,getExternalCacheDir());
            if (temp!=null){
                FileOutputStream outputStream=new FileOutputStream(temp);
                PrintStream printStream=new PrintStream(outputStream);
                printStream.print("good good study,day day up");
                printStream.close();
                outputStream.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

在这里插入图片描述
(六)查询空闲空间

如果你事先知道要存储的数据量的大小,你就可以先查询一下可用空间有多少,这样就可以避免lOException,可用的方法是getFreeSpace–返回剩余空间
getTotalSpace—返回总空间。

但是返回的可用空间大小,并不说明,你就可以存入这么多的数据。如果空间比你要存入的数据大几M,或者空间被占用率小于90%,都还可以,反之,就未必能存入。

并不需要每次存文件之前都来这么个判断,加个异常捕捉就OK。而且,你也未必知道你要存入的数据有多大,你想判断,也没法判断的,所以能catch这 个IOException就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值