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

public void canfileControl()
{

/** *//**
* 判斷系統是否支持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);
}

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

while (emun.hasMoreElements())
{
tmp = emun.nextElement().toString();
System.out.println("root: " + tmp);
}
}
這方法也是在網上看到的,我試過。但是對于Nokia的機型好像不行,即使Nokia支持該類,返回的仍然是null值。我認為可能是key不同。請高人指導。
2)實現 “文件夾創建/文件創建/文件寫入/文件讀取”功能
注意,當我們要進入文件系統,對它進行操作時,系統會中斷操作,詢問用戶是否要對文件系統進行操作。所以我們必須使用一個線程,來進行文件系統的操作。
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。
* 如果沒有指定第二個參數,則默認為READ_WRITE方式。
* 注意文件夾的路徑寫法,路徑最后有“/”,則表示打開的是文件夾。
* 文件路徑的寫法有很多種,這里的路徑寫法適合與索愛的機型。
* 比如: MOTO:file:///e/other/notes
*/
fc = (FileConnection) Connector.open(
"file://localhost/e:/other/notes/", Connector.READ);

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

if (!fc.exists())
{

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

/** *//**
* 如果文件不存在,創建文件
* 此方法要求文件的打開方式為可寫
*/
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)其他方法介紹
除了上面講的一些方法的用法外,FileConnection 還有其他很多有用的方法。這里就不介紹了。你可以下載J2ME幫助文檔 ,里面對每個方法都有一些介紹。
結束語
關于文件系統操作方面的內容就介紹到這里,還在學習當中。有重要發現,會及時補充。有不正確的地方,請高手指點!
posted on 2007-08-07 10:28
Fang.W 閱讀(7030)
評論(4) 編輯 收藏 所屬分類:
J2ME