J2ME的檔案系統運用(一)

pjw100發表於2020-04-04

這幾天初次開始學習運用手機的檔案系統,在網上也搜尋了一些資料,通過不斷地嘗試和運用,對手機的檔案系統也瞭解不少。

1、手機的檔案系統
手機的檔案系統就像電腦的硬碟一樣,供使用者儲存資料夾和檔案。在wtk2.52的模擬器下,預設的根目錄為root1/,底下有一個子資料夾photos/。在Nokia 的機器上,手機儲存的根目錄為C:/,儲存卡的目錄為E:/。操作手機的檔案系統條件:手機要支援JSR75,對於未簽名的MIDlet程式還要在程式管理中設定相應的許可權才能操作檔案系統。

2、JSR75
如果你沒有JSR75的api,到這裡可以下載
JSR75包括FileSystem部分和PIM部分,現在還沒用到PIM部分,暫時不考慮。下面簡單的介紹些FileSystem所用到的一些類和介面:

  • ConnectionClosedException —— 當試圖對一個已經關閉的 FileConnection 物件進行操作時,會丟擲此異常。
  • FileConnection —— 這是一個很關鍵的類,基本上檔案讀寫都是有該類完成。可以從字面上去理解它的意思。
  • FileSystemEventHandler —— 這個類我也沒用過,不知道它具體的功能。
  • FileSystemListener —— 用於監聽檔案系統目錄狀態的變化,比如檔案的刪除、新增,儲存卡的拔出和插入等。
  • FileSystemRegistry —— 用於管理和跟蹤檔案系統的監聽器,以及可以通過此類得到所有檔案系統的根目錄。
  • IllegalModeException —— 檔案開啟模式異常,當試圖寫入以只讀方式開啟的檔案時,會丟擲該異常。

3、我個人對檔案系統的理解
首先操作FileSystem最常用的類是FileConnection,結合流的操作進行檔案的讀和寫。操作檔案很像操作網路連線,一個是FileConnection,一個則是HttpConnection,兩者在操作時都需要一個url(路徑),檔案系統是localhost,HttpFileConnection則是請求一個網路連線。所以我把檔案系統的操作也理解為請求,只不過沒有POST和GET之分。

4.簡單示例
下面的示例裡面提供了列出根目錄,以及目標資料夾下的檔案和資料夾的方法,檔案和資料夾的區別在於檔名包含”/”字元。
經過我在N95 的機器上測試,C:/,C:/data/我們是無法進行讀寫的,通過應用程式只能夠讀取到C:/data/下的sounds/,images/,videos/這三個資料夾,即使在Nokia真機上的C:/data/下包含別的檔案或資料夾,應用程式也無法讀取到。

/**
 *
 * @author 水貨程式設計師
 */
public class FileSystem {

    /**
     * 判斷是否支援檔案系統
     * @return
     */
    public boolean isFileSystemSupport() {
        String version = System.getProperty("microedition.io.file.FileConnection.version");
        if (version == null) {
            return false;
        }
        return true;
    }

    /**
     * 獲取所有根目錄
     * @return
     */
    private Vector getRoots() {
        Vector rootVector = new Vector();
        Enumeration enums = FileSystemRegistry.listRoots();
        while (enums.hasMoreElements()) {
            String rootName = enums.nextElement().toString();
            rootVector.addElement(rootName);
        }
        return rootVector;
    }

    /**
     * 獲取目標資料夾下的所有直系子資料夾
     * @param path
     * @return
     */
    public Vector getFolders(String path) {
        Vector folderVector = new Vector();
        try {
            FileConnection fc = (FileConnection) Connector.open(path, Connector.READ);
            if (fc.exists()) {
                boolean isFolder = fc.isDirectory();
                if (isFolder) {
                    Enumeration enums = fc.list();
                    while (enums.hasMoreElements()) {
                        String name = enums.nextElement().toString();
                        //如果有斜槓,就是資料夾
                        if (name.indexOf("/") > 0) {
                            folderVector.addElement(name);
                        }
                    }
                }
            }
            fc.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return folderVector;
    }

    /**
     * 獲取目標資料夾下的所有檔案
     * @param path
     * @return
     */
    public Vector getFiles(String path) {
        Vector fileVector = new Vector();
        try {
            FileConnection fc = (FileConnection) Connector.open(path, Connector.READ);
            if (fc.exists()) {
                boolean isFolder = fc.isDirectory();
                if (isFolder) {
                    Enumeration enums = fc.list();
                    while (enums.hasMoreElements()) {
                        String name = enums.nextElement().toString();
                        //如果沒有斜槓,就是檔案
                        if (name.indexOf("/") < 0) {
                            fileVector.addElement(name);
                        }
                    }
                }
            }
            fc.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return fileVector;
    }

    /**
     * 獲取目標資料夾下的所有檔案和直系子資料夾
     * @param path
     * @return
     */
    public Vector getFoldersAndFiles(String path) {
        Vector v = new Vector();
        try {
            FileConnection fc = (FileConnection) Connector.open(path, Connector.READ);
            if (fc.exists()) {
                boolean isFolder = fc.isDirectory();
                if (isFolder) {
                    Enumeration enums = fc.list();
                    while (enums.hasMoreElements()) {
                        String name = enums.nextElement().toString();
                        v.addElement(name);
                    }
                }
            }
            fc.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return v;
    }

 }

程式碼用法舉例:如果要獲取C:/data/images/底下的檔案列表,我們在傳入path時應該這樣寫
FileSystem fs = new FileSystem();
Vector v = fs.getFiles(“files:///c:/data/images/”);

相關文章