国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

FC API(JSR 75)簡單講解

2019-11-18 16:10:07
字體:
供稿:網(wǎng)友
        前言:在網(wǎng)上搜了一圈,沒有找到多少PIM和FC的中文資料,所以,參考了一些資料,并簡單寫下一些我使用中的想法,希望能和大家多多交流,不足之處,請大家不吝賜教,我的郵箱是:stormbupt@163.com

概述

JSR 75(PDA Optional Packages for the J2METM Platform)中定義了兩個可選包:
PIM (The Personal Information Management)API,提供對個人信息數(shù)據(jù)的訪問,一般包括名片夾,日歷項,和待辦事項。
FC(The FileConnection) APIs,提供對本地文件系統(tǒng)的訪問。

本文簡單講解FC API的特性的用法。

一、FC API與RMS

       簡單地寫一點,這兩個東東其實沒有可比性,功能側(cè)重不同,F(xiàn)C  APIs提供了MIDlets與本地文件和其它應(yīng)用的交互,比如我們可以通過FC  API在MIDlets中打開外部的各種文件,并且保存一些極大的資源,這一點RMS沒有辦法做到的,F(xiàn)C API并不是強制實現(xiàn)的。
       RMS用來存儲程序中的一些數(shù)據(jù),F(xiàn)C  API不會取代RMS。

二、FC  API簡介       

1.FC API中的類和接口

接口:
javax.microedition.io.file.FileConnection,繼承自CLDC中的javax.microedition.StreamConnection;  
javax.microedition.io.file.FIleSystemListener,用于監(jiān)聽文件系統(tǒng)目錄狀態(tài)變化的通知,比如文件的刪除和新增,存儲卡的撥出的插入;onnectionClosed

類:
javax.microedition.io.file.FileSystemRegistry,用于獲取當前所有文件的根目錄和管理跟蹤文件系統(tǒng)的監(jiān)聽器;
javax.microedition.io.file.IllegalModeException,文件打開模式異常,當試圖寫入以只讀方式打開的文件時,該異常會被拋出;
javax.microedition.io.file.ConnectionClosedException,當試圖對一個已經(jīng)關(guān)閉的FileConnection對像作操作時,該異常會被拋出。

2.驗證系統(tǒng)是否支持FC API

可以通過系統(tǒng)屬性來驗證手機是否支持FC  API:
System.get如果支持的話,會返回FC API的版本號,一般是1.0,
如果不支持,則返回null,
現(xiàn)在支持FC API的手機非常少,
MOTO的A1系列手機有幾款支持,我手上用過的V635就支持。
(說明一下,MOTO用的是自己的包com.motorola.io.file,但和FC幾乎一樣)

三、FC API的使用

1.打開一個文件

將使用file協(xié)議的url傳入Connector以創(chuàng)建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()就好
}

值得注意的是,如果文件不存在的話,語句也可以正常執(zhí)行,并不會拋出任何異常,所以,為了避免后續(xù)操作中不必要的麻煩,我們要用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();
指定完整的路徑和目錄名后調(diào)用方法mkdir()來創(chuàng)建新的目錄:
FileConnection fconn = null;

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

列目錄下的所有內(nèi)容,用list()方法,此方法返回一個java.util.Enumeration類的對像
java.util.Enumeration enu = fconn.list();
接下來就可以通過java.util.Enumeration中的hasMoreElements()方法來判斷目錄下是否還有內(nèi)容并進行相應(yīng)操作
while(enu.hasMoreElements()){
   //.....................................

}
說明一點,此處返回的是一個java.util.Enumeration類的對像,實際上就是一個String數(shù)組,這一點參考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(),然后自己處理一下這個數(shù)組就行了。

 

4.監(jiān)聽文件系統(tǒng)的變化

可以用FileSystemListener來監(jiān)聽文件系統(tǒng)的改變(增加,刪除,修改),以便作出響應(yīng),
在此以存儲卡的撥出和插入為例,代碼是找的現(xiàn)成的:)
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
    }

}

注冊監(jiān)聽到FileSystemRegistry:
FileSystemListener listener = new FSListener();
FileSystemRegistry.addFileSystemListener(listener);

 

四、FC API的安全性

對于未經(jīng)過簽名的MIDlet,在每次使用FC  API讀取文件時,都會提示用戶是否允許,非常煩人FC API(JSR 75)簡單講解
并且不允許對文件進行寫操作,,,
而MOTO自己的包更是狠,沒有認證的程序是不能讀取任何文件的。。。所以幾乎沒用

如果程序中要用到FC API的話,最好還是去找產(chǎn)商認證一下,會大大提供程序的友好性。

(出處:http://www.survivalescaperooms.com)



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 连城县| 成安县| 阆中市| 琼结县| 株洲市| 宁武县| 都昌县| 庆安县| 重庆市| 长宁区| 遂溪县| 桂东县| 民县| 云梦县| 黄冈市| 安平县| 浦北县| 肃南| 香格里拉县| 大厂| 江永县| 巴东县| 阿瓦提县| 石柱| 孟村| 隆昌县| 兰州市| 奇台县| 德江县| 寿光市| 团风县| 静宁县| 莫力| 鹤山市| 莱西市| 兴业县| 巴彦淖尔市| 社旗县| 独山县| 花莲县| 新龙县|