J2ME的文件系统运用(一)

这几天初次开始学习运用手机的文件系统,在网上也搜索了一些资料,通过不断地尝试和运用,对手机的文件系统也了解不少。

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/”);

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值