这几天初次开始学习运用手机的文件系统,在网上也搜索了一些资料,通过不断地尝试和运用,对手机的文件系统也了解不少。
1、手机的文件系统
手机的文件系统就像电脑的硬盘一样,供用户存储文件夹和文件。在wtk2.52的模拟器下,默认的根目录为root1/,底下有一个子文件夹photos/。在Nokia 的机器上,手机存储的根目录为C:/,存储卡的目录为E:/。操作手机的文件系统条件:手机要支持JSR75,对于未签名的MIDlet程序还要在程序管理中设置相应的权限才能操作文件系统。
2、JSR75
如果你没有JSR75的api,到这里可以下载。
JSR75包括FileSystem部分和PIM部分,现在还没用到PIM部分,暂时不考虑。下面简单的介绍些FileSystem所用到的一些类和接口:
- ConnectionClosedException —— 当试图对一个已经关闭的 FileConnection 对象进行操作时,会抛出此异常。
- FileConnection —— 这是一个很关键的类,基本上文件读写都是有该类完成。可以从字面上去理解它的意思。
- FileSystemEventHandler —— 这个类我也没用过,不知道它具体的功能。
- FileSystemListener —— 用于监听文件系统目录状态的变化,比如文件的删除、新增,存储卡的拔出和插入等。
- FileSystemRegistry —— 用于管理和跟踪文件系统的监听器,以及可以通过此类得到所有文件系统的根目录。
- IllegalModeException —— 文件打开模式异常,当试图写入以只读方式打开的文件时,会抛出该异常。
3、我个人对文件系统的理解
首先操作FileSystem最常用的类是FileConnection,结合流的操作进行文件的读和写。操作文件很像操作网络连接,一个是FileConnection,一个则是HttpConnection,两者在操作时都需要一个url(路径),文件系统是localhost,HttpFileConnection则是请求一个网络连接。所以我把文件系统的操作也理解为请求,只不过没有POST和GET之分。
4.简单示例
下面的示例里面提供了列出根目录,以及目标文件夹下的文件和文件夹的方法,文件和文件夹的区别在于文件名包含”/”字符。
经过我在N95 的机器上测试,C:/,C:/data/我们是无法进行读写的,通过应用程序只能够读取到C:/data/下的sounds/,images/,videos/这三个文件夹,即使在Nokia真机上的C:/data/下包含别的文件或文件夹,应用程序也无法读取到。
/** * * @author 水货程序员 */ public class FileSystem { /** * 判断是否支持文件系统 * @return */ public boolean isFileSystemSupport() { String version = System.getProperty("microedition.io.file.FileConnection.version"); if (version == null) { return false; } return true; } /** * 获取所有根目录 * @return */ private Vector getRoots() { Vector rootVector = new Vector(); Enumeration enums = FileSystemRegistry.listRoots(); while (enums.hasMoreElements()) { String rootName = enums.nextElement().toString(); rootVector.addElement(rootName); } return rootVector; } /** * 获取目标文件夹下的所有直系子文件夹 * @param path * @return */ public Vector getFolders(String path) { Vector folderVector = new Vector(); try { FileConnection fc = (FileConnection) Connector.open(path, Connector.READ); if (fc.exists()) { boolean isFolder = fc.isDirectory(); if (isFolder) { Enumeration enums = fc.list(); while (enums.hasMoreElements()) { String name = enums.nextElement().toString(); //如果有斜杠,就是文件夹 if (name.indexOf("/") > 0) { folderVector.addElement(name); } } } } fc.close(); } catch (IOException ex) { ex.printStackTrace(); } return folderVector; } /** * 获取目标文件夹下的所有文件 * @param path * @return */ public Vector getFiles(String path) { Vector fileVector = new Vector(); try { FileConnection fc = (FileConnection) Connector.open(path, Connector.READ); if (fc.exists()) { boolean isFolder = fc.isDirectory(); if (isFolder) { Enumeration enums = fc.list(); while (enums.hasMoreElements()) { String name = enums.nextElement().toString(); //如果没有斜杠,就是文件 if (name.indexOf("/") < 0) { fileVector.addElement(name); } } } } fc.close(); } catch (IOException ex) { ex.printStackTrace(); } return fileVector; } /** * 获取目标文件夹下的所有文件和直系子文件夹 * @param path * @return */ public Vector getFoldersAndFiles(String path) { Vector v = new Vector(); try { FileConnection fc = (FileConnection) Connector.open(path, Connector.READ); if (fc.exists()) { boolean isFolder = fc.isDirectory(); if (isFolder) { Enumeration enums = fc.list(); while (enums.hasMoreElements()) { String name = enums.nextElement().toString(); v.addElement(name); } } } fc.close(); } catch (IOException ex) { ex.printStackTrace(); } return v; } }
代码用法举例:如果要获取C:/data/images/底下的文件列表,我们在传入path时应该这样写
FileSystem fs = new FileSystem();
Vector v = fs.getFiles(“files:///c:/data/images/”);