概述
JSR 75(PDA Optional Packages for the J2METM Platform)中定義了兩個可選包:
PIM (The Personal Information Management)API,供給對個人信息數據的拜訪,一般包含名片夾,日歷項,和待辦事項。
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
Connector.open()
.
所以,也可以應用這樣的方法: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的話,最好還是往找產商認證一下,會大大供給程序的友愛性。