一、是否能夠讀寫
想要自己編寫的程序能夠讀寫文件(注意這里所說的文件不是指jar包中的文件,是指比如手機內存或卡中的文件),
首先要確認程序將要安裝的手機是否支持 JSR75 ;其次還要知道該手機是否允許未簽名的程序訪問內部文件系統(tǒng)。如果
其中有一個條件不能滿足,那么程序就無法實現(xiàn)出文件的讀寫功能了。
在對文件系統(tǒng)的操作方面,J2ME提供的功能是很有限的,之所以有這么多的限制,是為了安全著想。J2ME在設計之初
就是為了安全方便的實現(xiàn)有限功能而設計的。所以即便有很多的限制,它的易用性,是很多人傾心于使用它。
前面說到了一個軟件“簽名”的問題,其實是一個“授權”的問題。即:在手機中運行的程序是有很多的限制的,如是
否有訪問網(wǎng)絡的權限,是否能夠訪問文件系統(tǒng)等。如果某軟件得到了手機開發(fā)商/運營商的簽名授權,則可以得到很多權限。
授權的證書有3個域,不同的域有不同的權限。但是有些手機是可以自己設置軟件的權限的,比如我的索愛手機就可以設置有
關訪問網(wǎng)絡及文件系統(tǒng)的權限。
二、JSR75 介紹
關于 JSR75 方面的詳細內容,你可以去看看 SonyEricsson/Nokia/MOTO 提供的開發(fā)包中的幫助文檔,這些幫助文檔中
都有介紹這個包。
JSR75 是為了實現(xiàn)對文件系統(tǒng)的操作功能,另外設計的,是一個擴展包。在 MIDP API 中是沒有關于文件讀寫方面的方法
的。所以在安裝程序之前要確認手機是否支持該包。
來看看JSR75中有那些內容:
(1)FC API
javax.microedition.io.file —— 提供對本地文件系統(tǒng)的訪問功能
ConnectionClosedException —— 當試圖對一個已經關閉的 FileConnection 對象進行操作時,會拋出此異常。
FileConnection —— 這是一個很關鍵的類,基本上文件讀寫都是有該類完成。可以從字面上去理解它的意思。
FileSystemEventHandler —— 這個類我也沒用過,不知道它具體的功能。
FileSystemListener —— 用于監(jiān)聽文件系統(tǒng)目錄狀態(tài)的變化,比如文件的刪除、新增,存儲卡的拔出和插入等。
FileSystemRegistry —— 用于管理和跟蹤文件系統(tǒng)的監(jiān)聽器,以及可以通過此類過去當前所有文件系統(tǒng)的根目錄。
IllegalModeException —— 文件打開模式異常,當試圖寫入以只讀方式打開的文件時,會拋出該異常。
(2)PIM API
javax.microedition.io.pim —— 提供對個人信息數(shù)據(jù)的訪問,一般包括名片夾、日歷項和待辦事項。
此包這次暫不介紹,自己還沒有用過。
三、根據(jù)程序詳細介紹有關文件系統(tǒng)的操作
1)驗證手機系統(tǒng)是否支持FC API
我們可以通過系統(tǒng)屬性來驗證手機是否支持 FC API:

public void canfileControl()
{

/** *//**
* 判斷系統(tǒng)是否支持FC
*/
String version = System.getProperty("microedition.io.file.FileConnection.version");

if (version == null)
{
System.out.println("cannot control fileSystem!");
return;

} else
{
System.out.println("version: " + version);
}

/** *//**
* 獲取文件系統(tǒng)的所有根目錄
* 索愛的機型,所有的根目錄是:
* e:/
* c:/
* root1/
*/
Enumeration emun = FileSystemRegistry.listRoots();
String tmp = "";

while (emun.hasMoreElements())
{
tmp = emun.nextElement().toString();
System.out.println("root: " + tmp);
}
}
這方法也是在網(wǎng)上看到的,我試過。但是對于Nokia的機型好像不行,即使Nokia支持該類,返回的仍然是null值。我認為可能是key不同。請高人指導。
2)實現(xiàn) “文件夾創(chuàng)建/文件創(chuàng)建/文件寫入/文件讀取”功能
注意,當我們要進入文件系統(tǒng),對它進行操作時,系統(tǒng)會中斷操作,詢問用戶是否要對文件系統(tǒng)進行操作。所以我們必須使用一個線程,來進行文件系統(tǒng)的操作。
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;

import javax.microedition.io.Connector;
import javax.microedition.io.file.FileConnection;
import javax.microedition.io.file.FileSystemRegistry;
import javax.microedition.lcdui.ChoiceGroup;
import javax.microedition.lcdui.List;
import javax.microedition.lcdui.TextBox;
import javax.microedition.lcdui.TextField;


public class FileControl extends Thread implements Runnable
{


public void control1()
{

FileConnection fc = null;
Enumeration enums = null;
String str = "";
List list;


try
{

/** *//**
* 打開一個 文件/文件夾 ,可以以三種方式打開:READ、READ_WRITE、WRITE。
* 如果沒有指定第二個參數(shù),則默認為READ_WRITE方式。
* 注意文件夾的路徑寫法,路徑最后有“/”,則表示打開的是文件夾。
* 文件路徑的寫法有很多種,這里的路徑寫法適合與索愛的機型。
* 比如: MOTO:file:///e/other/notes
*/
fc = (FileConnection) Connector.open(
"file://localhost/e:/other/notes/", Connector.READ);

/** *//**
* 注意,上面的方法在文件不存在的情況下,仍能執(zhí)行成功,所以我們要用下面的方法
* 判斷文件是否存在,此函數(shù)要求文件是可讀的,
* 即文件打開方式不能是以 Connector.WRITE 方式打開的
* 否則會拋出 IllegalModeException 異常
*/

if (!fc.exists())
{

/** *//**
* 如果不存在,就創(chuàng)建一個文件夾。
* 注意此函數(shù)要求文件的打開方式是可寫的,
* 即用上面的可讀方式,在執(zhí)行到這里會拋出 IllegalModeException 異常
* 所以我們應該改成Connector.READ_WRITE 方式
* 也可以用下面的方法:fc.setWritable(true)
* 但要注意的是,這時文件就不可讀了,也就是說你再使用fc.exists(),會拋出異常
* 所以最好的方法是在打開時就設置為Connector.READ_WRITE 方式
* 還要注意的是,此方法只能創(chuàng)建一層目錄,即,如果other文件夾也不存在,則創(chuàng)建會失敗
* 拋出IO異常。所以該方法執(zhí)行成功的情況是在other文件夾存在的情況下
*/
fc.setWritable(true);
fc.mkdir();

} else
{

/** *//**
* 下面的方法是判斷打開的文件是否為文件夾
*/
boolean isfolder = fc.isDirectory();

if(!isfolder)
{
return;
}
list = new List("list", ChoiceGroup.IMPLICIT);

/** *//**
* 獲取目錄下所有文件,
* 注意此方法返回的是所有文件的名字。
* 要求文件的打開方式是可讀
*/
enums = fc.list();

while (enums.hasMoreElements())
{
str = enums.nextElement().toString();
list.append(str, null);
}
}
fc.close();

} catch (Exception e)
{
System.out.println("get file error!!!!!!");
}
}


public void control2()
{
FileConnection fc = null;
TextBox tb;

/** *//**
* 打開文件
*/

try
{
fc = (FileConnection) Connector.open("file://localhost/e:/other/notes/1.txt", Connector.READ_WRITE);

if(!fc.exists())
{

/** *//**
* 如果文件不存在,創(chuàng)建文件
* 此方法要求文件的打開方式為可寫
*/
fc.create();

/** *//**
* 打開輸出流,用于向文件輸出內容
* 要求文件打開方式為可寫
*/
OutputStream out = fc.openOutputStream();
byte[] b = "contents".getBytes("UTF-8");
out.write(b);
out.flush();
out.close();

}else
{

/** *//**
* 打開輸入流,讀取文件中的內容
* 要求文件打開方式為可讀
*/
InputStream dis = fc.openInputStream();

/** *//**
* 獲取文件大小
*/
int size = (int)fc.fileSize();
byte[] bytes = new byte[size];
dis.read(bytes, 0, bytes.length);
String str = new String(bytes, "UTF-8");
tb = new TextBox("", str, 200, TextField.ANY);
dis.close();
}
fc.close();

}catch(Exception e)
{
System.out.println("get file error!!!!!!");
}
}
}
3)其他方法介紹
除了上面講的一些方法的用法外,F(xiàn)ileConnection 還有其他很多有用的方法。這里就不介紹了。你可以下載J2ME幫助文檔 ,里面對每個方法都有一些介紹。
結束語
關于文件系統(tǒng)操作方面的內容就介紹到這里,還在學習當中。有重要發(fā)現(xiàn),會及時補充。有不正確的地方,請高手指點!
posted on 2007-08-07 10:28
Fang.W 閱讀(7043)
評論(4) 編輯 收藏 所屬分類:
J2ME