安卓开发-文件读写权限


安卓规定app创建的私有文件只有该app可以读写;想要使其他app也可以读写的文件就需要创建公有文件,请看下面两个例子:

!注:Context.MODE_WORLD_WRITEABLE和Context.MODE_WORLD_READABLE这种写法已经被遗弃了,不推荐使用此写法,后面对此有专门的篇章讲解

app1:创建一个私有文件private.txt和一个公有文件public.txt

public void saveprivate(View view){//写入私有文件private.txt
    try {
        File file=new File(this.getFilesDir(),"private.txt");//创建文件保存路径
        FileOutputStream fos= new FileOutputStream(file);//创建输出流
        fos.write("这是写入的私有数据".getBytes());//输出流写入新的数据
        fos.close();//关闭输出流
        Toast.makeText(this,"写入成功",Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
        e.printStackTrace();
        Toast.makeText(this,"写入失败",Toast.LENGTH_SHORT).show();
    }

}
public void savepublic(View view){//写入公有文件public
    try {
        FileOutputStream fos=openFileOutput("public.txt", Context.MODE_WORLD_WRITEABLE+Context.MODE_WORLD_READABLE);//创建可读可写的文件
        fos.write("这是写入的公有数据".getBytes());//输出流写入新的数据
        fos.close();//关闭输出流
        Toast.makeText(this,"写入成功",Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
        e.printStackTrace();
        Toast.makeText(this,"写入失败",Toast.LENGTH_SHORT).show();
    }
}

app2:分别读取app1的私有文件和公有文件

public void readpublic(View view){//读取公有文件public
    try {
        File file=new File("/data/data/com.example.administrator.filerandw/files/public.txt");//此文件夹为app1之前创建的私有文件
        FileInputStream fis=new FileInputStream(file);
        BufferedReader br=new BufferedReader(new InputStreamReader(fis));
        String s=br.readLine();
        Toast.makeText(this,s,Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
        e.printStackTrace();
        Toast.makeText(this,"读取失败",Toast.LENGTH_SHORT).show();
    }
}
public void readprivate(View view){//读取私有文件public
    try {
        File file=new File("/data/data/com.example.administrator.filerandw/files/private.txt");
        FileInputStream fis=new FileInputStream(file);
        BufferedReader br=new BufferedReader(new InputStreamReader(fis));
        String s=br.readLine();
        Toast.makeText(this,s,Toast.LENGTH_SHORT).show();
    } catch (Exception e) {
        e.printStackTrace();
        Toast.makeText(this,"读取失败",Toast.LENGTH_SHORT).show();
    }
}

关于文件权限问题

在DDMS中查看文件或者在adb shell中使用ll查看文件时,会出现下图的现象,在permissions这里一列会有类似-rw-rw-r的写法:

例如:drwxr-x–x其中d表示这是一个文件夹(directory),w表示写(write),r表示读(read),x表示执行(execute),格式的权限分给了三组不同的用户群,分别是所有者,组,其他用户,所有者一般权限最高,具有wrx三个权限,到其他用户权限依次减小。

在adb shell中使用chmod 777 private.txt命令修改private的权限,chmod为change modify的简写,777为rwx的十六进制的写法:

0表示没有此权限,1表示有此权限

例如-rw-rw-rw-使用二进制写法为110 110 110,第一个“-”不参与,因为第一“-”表示是否是文件夹的意思110 110 110转化成十六进制为666,意思是其他用户以上级别的用户群都具有可读可写的权限,如果要更改一个文件的权限为可读可写,使用命令chmod 666 <文件名>即可