第二节 数据访问
Android
项目中有三个比较重要的文件夹:src
、assets
、res
,本节将依次介绍如何获取上述三个文件夹内的文件。
ClassLoader
在JavaSE中通常都会使用ClassLoader
(类加载器)来访问src
文件夹下的某个文件,在Android中也是同样如此。
问:什么是类加载器?
答:虚拟机若想运行某一个类,则必须先将其加载入内存,而加载类到内存的工具,就是类加载器
。换句话说,每一个存在于虚拟机(不论是JVM
还是Dalvik
)中的类,都是被类加载器载入内存的。
再问:类加载器的功能还有什么?
再答:类加载器除了可以加载字节码文件,还可以加载其他文件,只要该文件存在于类加载器所在的工作目录
下面即可。
还问:类加载器的工作目录是哪个目录?
还答:类加载器有多种,每种加载器的所加载的类是不同的。如:boot
类加载器加载Java核心类库中的类(String
类等)。 app
类加载器:加载用户自定义的类。它们两个类加载器的工作目录是不一样的。
接着问:如何获取一个ClassLoader
对象呢?
接着答:所有的类都是被类加载加载到内存的,在Java中使用Class
类来代表字节码,通过某个类的Class
对象就可以获取该类的加载器。
范例1:Class
类。
|
|
范例2:获取int
的类加载器。
|
|
范例3:加载文件。
|
|
语句解释:
- 首先在src根目录下面建立一个a.txt ,内容为:Hi Android世界。
- 若程序执行的时候出现了乱码,请检查您Android项目的编码是否使用的UTF-8。
范例4:加载文件2.0 。
|
|
语句解释:
- 首先在src目录下面的org.cxy.test包下面建立一个b.txt。
- 若需要访问某个包中的文件,则需要将包名中的“.”换成路径分隔符“/”。但是文件后缀名中的“.”不需要换。
- Andoird是基于Linus内核的,因此不可使用“\\”作为路径分隔符,因为那是Windows中使用的。
类装载器缺点
- 第一,类装载器会将文件一次性全部读入内存后再处理。
- 第二,类装载器,对于一个文件只会装载一次,若文件的内容在程序运行的时候被更新,则程序无法及时获得新的数据。
范例5:思考题,下面File
对象的相对路径相对于谁?。
|
|
语句解释:
- 答:相对于用户手机的根目录“/”,而不是apk包的根目录。
- 前面已经说了,用户手机中存在有三个目录:system、data、mnt ,这三个目录就是存在于根目录“/”下面的。
- 若File对象的构造方法中指定的路径是以“/”开头,则意味着该路径是绝对路径。
- 若在某个应用程序中想访问其他应用程序的文件(前提是该文件允许你访问他),就可以使用绝对路径的方式:
- 如:/data/data/org.cxy.file/files/a.txt 。
AssetManager
在Android
中可以使用AssetManager
类来访问assets
目录下的文件。assets
目录的特点:
- 首先,assets文件夹内单个文件的大小必须<=1MB 。
- 然后,assets文件夹内的文件不会被注册到R文件中。
- 接着,assets文件夹内可以任意自定义子文件夹。
- 最后,assets文件夹主要用于保存一些“容量小且固定不变”的文件,如:游戏音乐等。所谓的“固定不变”指的是在程序运行的时候,该文件仅会被程序读取而不会去修改其内容。
范例1:获取输入流。
|
|
语句解释:
- 为了减少篇幅,笔者把readFile方法具体实现给省略了。
范例2:遍历所有文件。
|
|
语句解释:
- 本范例中“manager.list(folder)”的含义为:将"assets/a"目录下面的所有文件的文件名称列出来。
- 将文件的路径path与list方法返回的文件的名称组合在一起后,就可以调用open方法获取该文件的输入流了。
第三节 App安装位置
从API level 8
开始,可以通过在manifest
中声明android:installLocation
属性,来将应用程序安装到外部存储设备中,如果不使用该属性,则应用默认只会安装在手机内存中。
例如:
|
|
如果该属性值设为preferExternal
,表明用户要求应用程序优先安装在外部存储设备中,但是系统并不保证应用程序真的安装在外部存储设备中。如果外部存储设备的空间已满,系统仍然会将应用程序安装在内存中。用户也可以在两个位置之间移动应用程序。
如果该属性值设为auto
,表明应用程序可能安装在外部存储设备中,但是用户本身对安装位置没有特殊要求。系统会根据多种因素决定将应用程序安装在哪里。用户也可以在两个位置之间移动应用程序。
当应用程序安装在外部存储设备中时:
- 只要外部存储设备装载在设备上,应用程序的性能就不会受到影响。
- .apk文件是保存在外部存储设备中的,但是所有的私有用户数据、数据库、优化的.dex文件和提取的本地代码都是保存在设备的内存中的。
- 保存应用程序的唯一容器经过一个随机产生的密钥进行加密。该密钥只能由最初安装该程序的设备解密。因此,安装在SD卡上的应用程序只能在某一个固定的设备上运行。
- 用户可以通过系统设置将应用程序移动到内存上。
注意:
- 当用户使用USB大容量存储器与计算机共享文件时,或通过系统设置卸载SD卡时,外部存储设备将从本设备卸载,并且所有在该外部存储设备中安装的应用程序将立刻被关闭。