`
wanchong998
  • 浏览: 236001 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

j2me中的文件操作包JSR75入门讲解

    博客分类:
  • J2me
阅读更多
JSR 75(PDA Optional Packages for the J2METM Platform)中定义了两个可选包:
1.PIM (The Personal Information Management)API,提供对个人信息数据的访问,一般包括名片夹,日历项,和待办事项。
2.FC(The FileConnection) APIs,提供对本地文件系统的访问。

本文简单讲解FC API的特性的用法。

一、FC API与RMS

       简单地写一点,这两个东东其实没有可比性,功能侧重不同,FC  APIs提供了MIDlets与本地文件和其它应用的交互,比如我们可以通过 FC  API在MIDlets中打开外部的各种文件,并且保存一些极大的资源,这一点RMS没有办法做到的,FC API并不是强制实现的。
       RMS用来存储程序中的一些数据,FC  API不会取代RMS。

二、FC  API简介      

1.FC API中的类和接口

接口:
javax.microedition.io.file.FileConnection,继承自CLDC中的javax.microedition.StreamConnection; 
javax.microedition.io.file.FIleSystemListener,用于监听文件系统目录状态变化的通知,比如文件的删除和新增,存储卡的拨出的插入;onnectionClosed

类:
javax.microedition.io.file.FileSystemRegistry,用于获取当前所有文件的根目录和管理跟踪文件系统的监听器;
javax.microedition.io.file.IllegalModeException,文件打开模式异常,当试图写入以只读方式打开的文件时,该异常会被抛出;
javax.microedition.io.file.ConnectionClosedException,当试图对一个已经关闭的FileConnection对像作操作时,该异常会被抛出。

2.验证系统是否支持FC API

可以通过系统属性来验证手机是否支持FC  API:
System.getProperty("microedition.io.file.FileConnection.version");
如果支持的话,会返回FC API的版本号,一般是1.0,
如果不支持,则返回null,
现在支持FC API的手机非常少,
MOTO的A1系列手机有几款支持,我手上用过的V635就支持。
(说明一下,MOTO用的是自己的包com.motorola.io.file,但和FC几乎一样)

三、FC API的使用

1.打开一个文件

将使用file协议的url传入Connector以创建FileConnection类,可以以READ,READ_WRITE和WRITE三种方式打开,代码如下:
FileConnection fconn = null;
try{
    fconn = (FileConnection)Connector.open("file:///a/mobile/audio/playlist.txt",Connector.READ);
}
catch(Exception e){
    log("open file error:"+e);  //大家当成System.out.println()就好
}

值得注意的是,如果文件不存在的话,语句也可以正常执行,并不会抛出任何异常,所以,为了避免后续操作中不必要的麻烦,我们要用fconn.exists()方法来自己判断文件是否存在:
FileConnection fconn = null;
try{
      fconn = (FileConnection)Connector.open("file:///a/mobile/audio/playlist.txt",Connector.READ);
      if(fconn.exist()){
      //..........................
      }
      else{//..................................}
   }
catch(Exception e){
    log("open file error:"+e); 
}

2.对文件的读写操作

读文件:
通过InputStream从FileConnection读取,然后自己再对InputStream做解析,用法很简单,和读取 HttpConnection差不多,附上以前程序里的一段详细代码,是用来读取播放列表文件的,程序中为了方便,是使用DataInputStream 直接读的,没有用到InputStream,实际上原理是一样的:
private void loadLists(){
     log("try open playlist");
     musicList.removeAllElements();//musicList是一个Vector,在本段代码之外定义并初始化
     FileConnection fconn = null;
     DataInputStream dis = null;
     try{
      //以只读模式打开playlist.txt文件
      fconn = (FileConnection)Connector.open("file:///a/mobile/audio/playlist.txt",Connector.READ);
      dis=fconn.openDataInputStream();//开输入流

      String tmp=null;
      do{
       try{
        tmp=dis.readUTF();//读文件路径
       } catch(Exception e){
        tmp = null;
       }
       if(tmp != null){
    
            OneMusic onemusic=new OneMusic();
            onemusic.filepath=tmp;
            onemusic.filename=dis.readUTF();//读文件名
            onemusic.filesize=dis.readLong();//读文件大小
            musicList.addElement(onemusic);          
          }
      }while(tmp!=null);
     
      
       log("playlist loaded");
      dis.close();
      fconn.close();
              
    }
     catch(Exception e){
      e.printStackTrace();
     }
  }

写文件:
通过OutputStream向FileConnection写入,附上写入播放列表的代码,同样我也用的是DataOutputStream,
private void saveLists(){
    log("try save playlist");
    FileConnection fconn = null;
   DataOutputStream ous = null;
  
   try{
    //以读写模式打开
    fconn = (FileConnection)Connector.open("file:///a/mobile/audio/playlist.txt",Connector.READ_WRITE);
     if(!fconn.exists()){//判断文件是否存在,如果不是,则新建一个
             NpPlayer.instance.showlog.dealReportMsg("playlist not exists ,create");
             fconn.create();  // create the file if it doesn't exist
             log("playlist created!!");
         } else {//如果文件存在,则将旧的文件删除,建立一个新文件
          fconn.delete();
          log("playlist exists,delete");
          fconn.create();
          log("playlist created!!");
         }
   ous = fconn.openDataOutputStream() ;
  
   log("saving playlists....");
  
   for(int i=0;i<musicList.size();i++){//将音乐列表按路径,文件名,文件大小的格式写入播放列表文件中
    OneMusic onemusic;
   
    onemusic=(OneMusic)musicList.elementAt(i);
   
    byte[] temp = null;
    ByteArrayOutputStream bos =new ByteArrayOutputStream() ;
    DataOutputStream dos =new DataOutputStream (bos) ;
   
    dos.writeUTF(""+onemusic.filepath);
    dos.writeUTF(""+onemusic.filename);
    dos.writeLong(onemusic.filesize);
    temp=bos.toByteArray();

    dos.close();
    bos.close();
  
    ous.write(temp,0,temp.length);
     }
   ous.flush();
    ous.close();
    fconn.close();
    log("playlist saved!!");
}
   catch(Exception e){
     e.printStackTrace();
   }

finally {
              try{
               if (ous != null)
                   ous.close();
           } catch (Exception closee){}
           try{
               if (fconn != null)
                   fconn.close();
           } catch (Exception closee){}
        }
 
  }
3.对目录的操作

判断是文件还是目录,使用isDirectory()方法
boolean isdir = fconn.isDirectory();
指定完整的路径和目录名后调用方法mkdir()来创建新的目录:
FileConnection fconn = null;

   try{
    fconn = (FileConnection)Connector.open("file:///a/mobile/audio/mymusic",Connector.READ_WRITE);
    fconn.mkdir();
      }
   catch(Exception e){}

列目录下的所有内容,用list()方法,此方法返回一个java.util.Enumeration类的对像
java.util.Enumeration enu = fconn.list();
接下来就可以通过java.util.Enumeration中的hasMoreElements()方法来判断目录下是否还有内容并进行相应操作
while(enu.hasMoreElements()){
   //.....................................

}
说明一点,此处返回的是一个java.util.Enumeration类的对像,实际上就是一个String数组,这一点参考FC API文档:
public java.util.Enumeration list()   throws java.io.IOException

Gets a list of all visible files and directories contained in a directory. The directory is the connection's target as specified in Connector.open().
 
Returns: An Enumeration of strings, denoting the files and directories in the directory...................
...................................
所以,也可以使用这样的方法:String[] tmp = fconn.list(),然后自己处理一下这个数组就行了。

4.监听文件系统的变化

可以用FileSystemListener来监听文件系统的改变(增加,删除,修改),以便作出响应,
在此以存储卡的拨出和插入为例,代码是找的现成的:)
public class FSListener implements FileSystemListener{
    public void stateChanged(int state,String name){
        if(state == FileSystemListener.ROOT_REMOVED)
        //root removed
        else if(state == FileSystemListener.ROOT_ADDED)
       //root added
    }

}

注册监听到FileSystemRegistry:
FileSystemListener listener = new FSListener();
FileSystemRegistry.addFileSystemListener(listener);



四、FC API的安全性

对于未经过签名的MIDlet,在每次使用FC  API读取文件时,都会提示用户是否允许,非常烦人.
并且不允许对文件进行写操作,而MOTO自己的包更是狠,没有认证的程序是不能读取任何文件的。。。所以几乎没用

如果程序中要用到FC API的话,最好还是去找产商认证一下,会大大提供程序的友好性。
分享到:
评论

相关推荐

    jsr75 API J2ME手机程序文件系统

    总的来说,JSR75 API为J2ME开发带来了强大的文件系统操作能力,使得开发者能够在移动设备上构建功能丰富的应用程序。通过熟练掌握这个API,开发者可以更好地满足用户对于数据存储和管理的需求,提升应用的用户体验。...

    J2ME API 速查手册0.7

    手册中相应图片、图表、文字的版权归原作者所有。你可以分发本手册的拷贝,但请保证其内容的完整性。www.j2medev.com对于使用本手册造成的任何损失,概不负责。 本手册0.7v 包含如下内容 J2ME Web Services ...

    j2me文件操作程序

    总之,这个J2ME文件操作程序是一个针对JSR 75规范的实现,它结合了文件系统访问和RMS功能,能够在移动设备上高效地删除文件。通过研究源代码,开发者可以学习如何在J2ME环境下执行文件操作,以及如何利用RMS进行数据...

    JSR-179_Location_API_for_J2ME.zip_j2me 1_j2me gps_j2me gps jsr17

    通过阅读这份文档,开发者可以深入理解如何在J2ME应用中有效利用JSR-179进行位置服务开发。 总结来说,JSR-179 Location API为J2ME应用程序提供了强大的地理位置服务支持,通过其丰富的接口和功能,开发者可以构建...

    j2me-API.rar_bluetooth_j2me api 中文

    J2ME Web Services RPC (JSR 172) J2ME Web Services XML (JSR 172) Java APIs for Bluetooth (JSR 82) Location API (JSR 179) MID Profile 2.0 (JSR-118) Mobile Media API 1.1 (JSR-135) Mobile 3D ...

    J2ME中多个文件上传

    总的来说,J2ME中的多文件上传是一个涉及网络通信、数据编码和流操作的复杂过程。理解multipart/form-data的工作原理和正确构建HTTP请求是关键。对于初学者来说,理解这个过程可能会有些困难,但一旦掌握,就能实现...

    Java J2ME文件操作代码集.rar

    在Java J2ME中进行文件操作,主要涉及到以下几个核心知识点: 1. **文件系统访问**:J2ME的`javax.microedition.io.Connector`类提供了对设备文件系统的访问接口。开发者可以通过`new FileConnection("file://path/...

    jsr75.jar j2me file操作

    这个jar包是关于j2me中文件的操作的。

    j2me jsr 75 PIM API

    JSR 75(Personal Information Management API for Java Platform, Micro Edition)是J2ME中的一个规范,专门用于在移动设备上处理个人信息管理(PIM)数据,如联系人、日程和待办事项。这个API使得开发者能够方便地...

    fileconnection (jsr75)源代码

    【标题】"fileconnection (jsr75)源代码"涉及的是Java ME平台中的JSR 75规范,即“Java API for Wireless Toolkit (J2ME) - PIM API”。这个规范定义了如何在移动设备上访问文件系统、个人信息管理(PIM)数据以及与...

    J2ME的API速查手册

    J2ME Web Services RPC (JSR 172) J2ME Web Services XML (JSR 172) Java APIs for Bluetooth (JSR 82) Location API (JSR 179) MID Profile 2.0 (JSR-118) Mobile Media API 1.1 (JSR-135) Mobile 3D ...

    J2ME速查手册包括了多方面的内容

    J2ME Web Services RPC (JSR 172) J2ME Web Services XML (JSR 172) Java APIs for Bluetooth (JSR 82) Location API (JSR 179) MID Profile 2.0 (JSR-118) Mobile Media API 1.1 (JSR-135) Mobile 3D ...

    JSR75操作手机内存

    JSR75(Java Specification Request 75)是针对J2ME平台的一组可选包,主要包含PIM API(个人信息管理应用程序接口)和FC API(文件连接应用程序接口),用于提供对移动设备上个人信息管理及文件系统访问的支持。...

    J2ME 入门学习书籍打包下载

    本压缩包提供了两本关于J2ME入门学习的电子书籍:《J2ME基础学习教程》和《j2mejiaocheng》。以下是对这两本书籍中可能包含的知识点的详细说明: 1. **J2ME架构**: - KVM(K Virtual Machine):J2ME的虚拟机,...

    J2ME文件操作

    为了在J2ME环境中安全高效地操作文件,开发者应遵循以下最佳实践: - 总是检查文件是否存在,避免对不存在的文件进行操作。 - 使用异常处理来捕获可能出现的IO异常,并提供有用的错误信息。 - 优化读写操作,尽可能...

    J2ME文件浏览器(MIDP版本)

    "J2ME文件浏览器(MIDP版本)"是汪江松开发的一款针对J2ME平台的文件管理应用,它允许用户在移动设备上查看和操作本地文件系统。这一项目的核心功能包括浏览文件夹结构、查看文件信息、打开某些类型的文件(如文本...

    开发j2me必备api 【jsr系列api】

    在J2ME开发中,JSR系列API扮演着至关重要的角色,它们为开发者提供了丰富的功能和接口来实现特定的设备功能。 以下是一些关键的JSR及其对应API在J2ME开发中的重要性: 1. **JSR 118: Java ME CLDC (Connected ...

    J2me API 说明文档,比较全

    J2ME Web Services RPC (JSR 172) J2ME Web Services XML (JSR 172) Java APIs for Bluetooth (JSR 82) Location API (JSR 179) MID Profile 2.0 (JSR-118) Mobile Media API 1.1 (JSR-135) Mobile 3D ...

Global site tag (gtag.js) - Google Analytics