FileOutputStream fos = context.openFileOutput("config.txt", Context.MODE_WORLD_READABLE|Context.MODE_WORLD_WRITEABLE);
其实这个写入模式(权限)可以同时配置多个,像是这里就是同时配置了读写
那么再次部署并操作老项目就会发现这次又出现了数据都无法写入成功,还是因为权限问题,废弃的MODE_WORLD_READABLE
2021-02-07 15:53:46.442 7753-7753/com.example.myapplication I/test: 正在输出到文件
2021-02-07 15:53:46.442 7753-7753/com.example.myapplication W/System.err: java.lang.SecurityException: MODE_WORLD_READABLE no longer supported
2021-02-07 15:53:46.442 7753-7753/com.example.myapplication W/System.err: at android.app.ContextImpl.checkMode(ContextImpl.java:2495)
2021-02-07 15:53:46.442 7753-7753/com.example.myapplication W/System.err: at android.app.ContextImpl.openFileOutput(ContextImpl.java:565)
2021-02-07 15:53:46.443 7753-7753/com.example.myapplication W/System.err: at android.content.ContextWrapper.openFileOutput(ContextWrapper.java:208)
2021-02-07 15:53:46.443 7753-7753/com.example.myapplication W/System.err: at com.example.myapplication.SavePwdService.saveToRomFile(SavePwdService.java:24)
2021-02-07 15:53:46.443 7753-7753/com.example.myapplication W/System.err: at com.example.myapplication.MainActivity.onClick(MainActivity.java:34)
2021-02-07 15:53:46.443 7753-7753/com.example.myapplication W/System.err: at android.view.View.performClick(View.java:6597)
2021-02-07 15:53:46.443 7753-7753/com.example.myapplication W/System.err: at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:967)
2021-02-07 15:53:46.443 7753-7753/com.example.myapplication W/System.err: at android.view.View.performClickInternal(View.java:6574)
2021-02-07 15:53:46.443 7753-7753/com.example.myapplication W/System.err: at android.view.View.access$3100(View.java:778)
2021-02-07 15:53:46.443 7753-7753/com.example.myapplication W/System.err: at android.view.View$PerformClick.run(View.java:25885)
2021-02-07 15:53:46.443 7753-7753/com.example.myapplication W/System.err: at android.os.Handler.handleCallback(Handler.java:873)
2021-02-07 15:53:46.443 7753-7753/com.example.myapplication W/System.err: at android.os.Handler.dispatchMessage(Handler.java:99)
2021-02-07 15:53:46.443 7753-7753/com.example.myapplication W/System.err: at android.os.Looper.loop(Looper.java:193)
2021-02-07 15:53:46.444 7753-7753/com.example.myapplication W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6669)
2021-02-07 15:53:46.444 7753-7753/com.example.myapplication W/System.err: at java.lang.reflect.Method.invoke(Native Method)
2021-02-07 15:53:46.444 7753-7753/com.example.myapplication W/System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
2021-02-07 15:53:46.444 7753-7753/com.example.myapplication W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2021-02-07 15:53:46.444 7753-7753/com.example.myapplication I/test: saveToRomFile fail
2021-02-07 15:53:46.485 7753-7786/com.example.myapplication D/EGL_emulation: eglMakeCurrent: 0xe52852a0: ver 3 0 (tinfo 0xe5283660)
2021-02-07 15:53:46.494 7753-7786/com.example.myapplication D/EGL_emulation: eglMakeCurrent: 0xe52852a0: ver 3 0 (tinfo 0xe5283660)
当然Context.MODE_WORLD_WRITEABLE也是被废弃的(上图中可以看到这个模式也被画上横线了)
只不过这里应该是走了短路或(异常抛出的短路或)的逻辑,所以Context.MODE_WORLD_WRITEABLE被废弃就没有抛出异常
如果你以为即便老项目这边没有写入成功,就带着侥幸去新项目尝试写入,则依然是失败的
2021-02-07 16:15:47.920 8184-8184/com.example.myapplication2 W/System.err: java.io.FileNotFoundException: /data/data/com.example.myapplication/files/config.txt (Permission denied)
2021-02-07 16:15:47.920 8184-8184/com.example.myapplication2 W/System.err: at java.io.FileOutputStream.open0(Native Method)
2021-02-07 16:15:47.920 8184-8184/com.example.myapplication2 W/System.err: at java.io.FileOutputStream.open(FileOutputStream.java:308)
2021-02-07 16:15:47.920 8184-8184/com.example.myapplication2 W/System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:238)
2021-02-07 16:15:47.920 8184-8184/com.example.myapplication2 W/System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:180)
2021-02-07 16:15:47.920 8184-8184/com.example.myapplication2 W/System.err: at com.example.myapplication2.MainActivity.onClick(MainActivity.java:58)
2021-02-07 16:15:47.920 8184-8184/com.example.myapplication2 W/System.err: at android.view.View.performClick(View.java:6597)
2021-02-07 16:15:47.920 8184-8184/com.example.myapplication2 W/System.err: at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:967)
2021-02-07 16:15:47.921 8184-8184/com.example.myapplication2 W/System.err: at android.view.View.performClickInternal(View.java:6574)
2021-02-07 16:15:47.921 8184-8184/com.example.myapplication2 W/System.err: at android.view.View.access$3100(View.java:778)
2021-02-07 16:15:47.921 8184-8184/com.example.myapplication2 W/System.err: at android.view.View$PerformClick.run(View.java:25885)
2021-02-07 16:15:47.921 8184-8184/com.example.myapplication2 W/System.err: at android.os.Handler.handleCallback(Handler.java:873)
2021-02-07 16:15:47.922 8184-8184/com.example.myapplication2 W/System.err: at android.os.Handler.dispatchMessage(Handler.java:99)
2021-02-07 16:15:47.922 8184-8184/com.example.myapplication2 W/System.err: at android.os.Looper.loop(Looper.java:193)
2021-02-07 16:15:47.922 8184-8184/com.example.myapplication2 W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6669)
2021-02-07 16:15:47.922 8184-8184/com.example.myapplication2 W/System.err: at java.lang.reflect.Method.invoke(Native Method)
2021-02-07 16:15:47.922 8184-8184/com.example.myapplication2 W/System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
2021-02-07 16:15:47.922 8184-8184/com.example.myapplication2 W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2021-02-07 16:15:47.963 8184-8211/com.example.myapplication2 D/EGL_emulation: eglMakeCurrent: 0xe5285420: ver 3 0 (tinfo 0xe52836f0)
2021-02-07 16:15:47.972 8184-8211/com.example.myapplication2 D/EGL_emulation: eglMakeCurrent: 0xe5285420: ver 3 0 (tinfo 0xe52836f0)
追加模式
Context.MODE_APPEND模式可以在写入配置文件时候以追加到内容尾部的形式进行写入,如
老项目修改写入模式为追加模式
FileOutputStream fos = context.openFileOutput("config.txt", Context.MODE_APPEND);
因为我这里写入了好几次所以可以看到后面追加的不止一对
追加模式默认也是私有的不可读的权限,我们运行第二个项目进行获取得到日志如:
2021-02-07 16:27:49.113 8587-8587/com.example.myapplication2 W/System.err: java.io.FileNotFoundException: /data/data/com.example.myapplication/files/config.txt (Permission denied)
文件权限
私有模式写入文件之后的文件权限是rwrw,即用户\所属组可读可写,关于rwrw这类文件权限表示法这里就不一一赘述了,详见linux相关权限知识
而对于MODE_WORLD_READABLE由于已经废弃了,所以并不存在任何类似Linux的权限了,文件都无法写入.那么对于以前则是rwrwr
而对于MODE_WORLD_WRITEABLE同样的是已经废弃了,写入文件时候日志猫都提示了
所以并不存在任何类似Linux的权限了,文件都无法写入.那么对于以前则是rwrww
那么对于Context.MODE_WORLD_READABLE|Context.MODE_WORLD_WRITEABLE模式则同样是无奈的…
2021-02-07 16:39:06.146 9109-9109/com.example.myapplication W/System.err: java.lang.SecurityException: MODE_WORLD_READABLE no longer supported
那么对于以前其是rwrwrw
对于文件权限的这10位占位,这里只稍微说明下第一位,这里显示为d的是目录,直接是-的则是文件
总结:
android有一套 自己的安全模型,当应用程序( apk)在安装时系统就会分配给他一个userid, 当该应用要去访问其他资源比如文件的时候,就需要usenid匹配。 默认情况下,任何应用创建的文件,都应该是私有的(位于ldata/data/<package name>/files),其他程序无法访问。除非在创建时指定了Context.MODE_WORLD_READABLE或者
Context. MODE_WORLD_WRITEABCE,只有这样其他程序才能正确访问。只是这两个模式已经被废除了,至少目前我这里使用的Android sdk9的版本就是被废除的.