现在的位置: 首页 > 综合 > 正文

android 文件读写概述

2017年12月24日 ⁄ 综合 ⁄ 共 3186字 ⁄ 字号 评论关闭

(1)data/data下面主要是/data/data/Package Name目录,

该目录下面主要是/data/data/Package Name/Shared_Pref, /data/data/Package Name/files, /data/data/Package Name/database这三个子目录,对应Preference,File, DataBase 三种存储方式.

(2)/data/data是所有应用程序可以使用的内存区域,这个是应用的私有目录,受到特殊保护的,也就是说你除了可以使用sdcard以外还可以在这个地方放一些文件或者临时数据.

(3)创建数据库默认会放在/data/data/Package Name/database文件夹下面.

(4)有root权限才能导入到手机的data\data\目录下面。

(5)

FileOutputStream outStream = this.openFileOutput("itcast.txt", Context.MODE_PRIVATE);
         outStream.write("传智播客".getBytes());
         outStream.close();  

如果文件不存在,Android 会自动创建它。创建的文件保存在/data/data/<package name>/files目录,如:/data/data/cn.itcast.action/files/itcast.txt 。

Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
如果希望文件被其他应用读和写,可以传入: 
openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);

android有一套自己的安全模型,当应用程序(.apk)在安装时系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data/<package name>/files),其他程序无法访问。除非在创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE ,只有这样其他程序才能正确访问。

如果要打开存放在/data/data/<package name>/files目录应用私有的文件,可以使用Activity提供openFileInput()方法。

FileInputStream inStream = this.getContext().openFileInput("itcast.txt");//不能包含目录"/"符号

Log.i("FileTest", readInStream(inStream));

或者直接使用文件的绝对路径:

File file = new File("/data/data/cn.itcast.action/files/itcast.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目录

当应用程序(.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/
FileReader file = new FileReader("Android.txt"); 
言外之意是如果某个文件或者数据不是程序私有的,既访问它时无须经过Android的权限检查,那么还是可以用java的io api来直接访问的。所谓的非私有数据是只放在sdcard上的文件或者数据,
可以用java的io api来直接打开sdcard上文件。
FileReader file = new FileReader("/sdcard/Android.txt"); 
如果要打开程序自己私有的文件和数据,那必须使用Activity提供openFileOutput和openFileInput方法。
创建程序私有的文件,由于权限方面的要求,必须使用activity提供的Android读写文件方法
FileOutputStream os = this.openFileOutput("Android.txt", MODE_PRIVATE);  
OutputStreamWriter outWriter = new OutputStreamWriter (os); 
读取程序私有的文件,由于权限方面的要求,必须使用activity提供的方法
FileInputStream os =this.openFileInput("Android.txt");  
InputStreamReader inReader = new InputStreamReader(os); 

(1)从assets读XML文件?
 InputStream inStream=context.getAssets().open("gift.xml");
(2)从assets读Bitmap文件?
 Bitmap bitmap=BitmapFactory.decodeStream(context.getAssets.open("1500.png"))
(3)从assets解析ZIP文件?
 ZipInputStream inZip=new ZipInputStream(context.getAssets().open("gift.zip"));

抱歉!评论已关闭.