Android开源手机操作系统可以让开发人员在模拟器中进行相应的操作以使系统满足用户的各种需求。在这里我们可以通过对Android读写文件的相关操作来体验一下这款操作系统的编写方式。

众所周知Android有一套自己的安全模型, 具体可参见Android开发文档。当应用程序(.apk)在安装时就会分配一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下 ,任何应用创建的文件,数据库, sharedpreferences都应该是私有的(位于/data/data/your_project/files/),其余程序无法访问。除非在创建时指明是MODE_WORLD_READABLE 或者 MODE_WORLD_WRITEABLE,只要这样其余程序才能正确访问。

因为有这种Android读写文件的方法在安全上有所保障,进程打开文件时Android要求检查进程的user id。所以不能直接用java的api来打开,因为java的io函数没有提这个机制 。

无法用java的api直接打开程序私有的数据 ,默认路径为/data/data/your_project/files/

        
  1. FileReaderfile=newFileReader("Android.txt");

这里特别强调私有数据!言外之意是如果某个文件或者数据不是程序私有的,既访问它时无须经过Android的权限检查,那么还是可以用java的io api来直接访问的。所谓的非私有数据是只放在sdcard上的文件或者数据,

可以用java的io api来直接打开sdcard上文件。

        
  1. FileReaderfile=newFileReader("/sdcard/Android.txt");

如果要打开程序自己私有的文件和数据,那必须使用Activity提供openFileOutput和openFileInput方法。

创建程序私有的文件,由于权限方面的要求,必须使用activity提供的Android读写文件方法

        
  1. FileOutputStreamos=this.openFileOutput("Android.txt",MODE_PRIVATE);
  2. OutputStreamWriteroutWriter=newOutputStreamWriter(os);

读取程序私有的文件,由于权限方面的要求,必须使用activity提供的方法

        
  1. FileInputStreamos=this.openFileInput("Android.txt");
  2. InputStreamReaderinReader=newInputStreamReader(os);

Android读写文件的相关操作就为大家介绍到这里。

Activity提供了openFileOutput()方法可以方便地把数据存储到文件中: FileOutputStream outStream = this.openFileOutput("record.txt",Content.MODE_PRIVATE); outStream.write("Hello world".getBytes()); outStream.close();
openFileOutput方法的第一个参数用于指定文件名,不能包含路径分隔符'/',如果文件不存在,会创建 文件,保存在/date/date/<package name>/files/目录下,如: /date/date/com.file.ui/files/record.txt
openFileOutput方法的第二个参数用于指定操作模式: Content.MODE_PRIVATE = 0; Content.MODE_APPEND = 32767; Content.MODE_WORLD_READABLE = 1; Content.MODE_WORLD_WRITEABLE = 2;
Content.MODE_PRIVATE为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容 Content.MODE_APPEND该模式会检查文件是否存在,存在就往文件追加内容,否则创建新文件 Content.MODE_WORLD_READABLE表示当前文件可以被其他应用读取 Content.MODE_WORLD_WRITEABLE表示当前文件可以被其他应用写入 如果希望文件被其他应用读和写,可以传入 Content.MODE_WORLD_READABLE + Content.MODE_WORLD_WRITEABLE
读取文件内容 —————— 如果要打开存放在/data/data/<package name>/files目录应用私有的文件,可以使用Activity提供openFileInput()方法。 FileInputStream inStream = this.getContext().openFileInput("record.txt"); Log.i("FileTest", readInStream(inStream)); readInStream()的方法如下: public static String readInStream(FileInputStream inStream){ try { ByteArrayOutputStream outStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length = -1; while((length = inStream.read(buffer)) != -1 ){ outStream.write(buffer, 0, length); } outStream.close(); inStream.close(); return outStream.toString(); } catch (IOException e) { Log.i("FileTest", e.getMessage()); } return null; }
或者直接使用文件的绝对路径: File file = new File("/data/data/com.file.ui/files/record.txt"); FileInputStream inStream = new FileInputStream(file); Log.i("FileTest", readInStream(inStream)); 注意:上面文件路径中的“cn.itcast.action”为应用所在包,当你在编写代码时应替换为你自己应用使用的包。 对于私有文件只能被创建该文件的应用访问,如果希望文件能被其他应用读和写,可以在创建文件时,指定Context.MODE_WORLD_READABLE
和Context.MODE_WORLD_WRITEABLE权限。
Activity还提供了getCacheDir()和getFilesDir()方法: getCacheDir()方法用于获取/data/data/<package name>/cache目录 getFilesDir()方法用于获取/data/data/<package name>/files目录

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. NPM 和webpack 的基础使用
  3. Python list sort方法的具体使用
  4. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  5. python list.sort()根据多个关键字排序的方法实现
  6. Android开发中AsyncTask实现异步处理任务的方法
  7. Android(安卓)Build 系统详解
  8. android热修复Java层原理和实现
  9. Android应用程序的快速启动

随机推荐

  1. Android预定义样式
  2. android数据库操作(二)
  3. android 调节屏幕亮度
  4. 如何为ListView设置分割线
  5. Android实现体重测量仪的源码
  6. writing dumpstate to file android
  7. Android(安卓)ProgressBar example
  8. android版本与API对应关系
  9. Follow up to “Android(安卓)graphics t
  10. Xposed: 勾住(Hook) Android应用程序对象