首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 文件操作 JSR 75 (FileConnection API) 入門與實戰指南

     編輯:J2ME

突破 RMS 限制:讀寫手機文件系統、SD 卡、與其他應用共享數據

RMS 只能存鍵值對,無法訪問真實文件系統。JSR 75 (PDA Optional Packages) 引入 FileConnection API (FC API),提供標準 javax.microedition.io.file 包,支持文件/目錄增刪改查、輸入輸出流、文件系統監聽。本文系統講解 FC API 核心類、讀寫代碼模式、目錄操作、監聽器與安全機制。

FC API vs RMS:定位完全不同

特性RMSFileConnection API
數據模型記錄存儲 (Record Store)真實文件系統 (文件/目錄樹)
跨應用共享不可共享 (私有)可讀取/寫入其他應用文件、SD 卡
存儲上限通常 < 100KB~1MB受限於文件系統剩餘空間 (MB~GB)
適用場景配置、高分、遊戲存檔音樂播放列表、大地圖數據、日誌、用戶導入導出
強制實現所有 MIDP 設備必須可選包,僅部分手機支持 (Moto A 系列、部分麼 S60、WM 手機)

核心接口與類

  • FileConnection (extends StreamConnection):文件/目錄操作句柄,提供 openInputStream()/openOutputStream()/openDataInputStream()/openDataOutputStream()、mkdir()/delete()/list()/exists()/isDirectory() 等。
  • FileSystemRegistry:listRoots() 獲取所有根目錄 (如 file:///a/、file:///b/),addFileSystemListener() 註冊監聽器。
  • FileSystemListener:stateChanged(int state, String rootName),狀態碼:ROOT_ADDED (插入 SD)、ROOT_REMOVED (拔出 SD)。
  • 異常:IllegalModeException (只讀寫入)、ConnectionClosedException (操作已關閉連接)。

檢測設備是否支持

String ver = System.getProperty("microedition.io.file.FileConnection.version");
if (ver != null) { /* 支持,版本通常 "1.0" */ }
else { /* 不支持,降級用 RMS */ }

文件讀取:標準流模式

private void loadPlaylist() {
    FileConnection fc = null; DataInputStream dis = null;
    try {
        fc = (FileConnection) Connector.open(
                "file:///a/mobile/audio/playlist.txt", Connector.READ);
        if (!fc.exists()) return; // 關鍵:文件不存在不拋異常,必須自查

        dis = fc.openDataInputStream();
        String path;
        while ((path = dis.readUTF()) != null) {
            String name = dis.readUTF();
            long size = dis.readLong();
            playlist.add(new Track(path, name, size));
        }
    } catch (EOFException e) { /* 正常讀完 */ }
    catch (Exception e) { e.printStackTrace(); }
    finally { close(dis); close(fc); }
}

文件寫入:覆蓋/追加/創建

private void savePlaylist() {
    FileConnection fc = null; DataOutputStream dos = null;
    try {
        fc = (FileConnection) Connector.open(
                "file:///a/mobile/audio/playlist.txt", Connector.READ_WRITE);
        if (!fc.exists()) fc.create(); // 創建文件
        else { fc.delete(); fc.create(); } // 簡單覆蓋策略

        dos = fc.openDataOutputStream();
        for (Track t : playlist) {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            DataOutputStream td = new DataOutputStream(bos);
            td.writeUTF(t.path); td.writeUTF(t.name); td.writeLong(t.size);
            td.close();
            dos.write(bos.toByteArray());
            bos.close();
        }
        dos.flush();
    } catch (Exception e) { e.printStackTrace(); }
    finally { close(dos); close(fc); }
}

目錄操作與遍歷

// 創建目錄
FileConnection fc = (FileConnection) Connector.open(
        "file:///a/mobile/music", Connector.READ_WRITE);
fc.mkdir();

// 列舉目錄內容
Enumeration en = fc.list(); // 返回 String 枚舉 (文件/目錄名)
while (en.hasMoreElements()) {
    String name = (String) en.nextElement();
    // 判斷是文件還目錄需再 open 該子項調用 isDirectory()
}

文件系統監聽:SD 卡熱插拔

public class SDListener implements FileSystemListener {
    public void stateChanged(int state, String rootName) {
        if (state == FileSystemListener.ROOT_ADDED) {
            // SD 卡插入,掃描新媒體文件
        } else if (state == FileSystemListener.ROOT_REMOVED) {
            // SD 卡拔出,清理引用、暫停播放
        }
    }
}

// 註冊
FileSystemRegistry.addFileSystemListener(new SDListener());

安全機制:簽名與授權

  • 未簽名 MIDlet:每次文件操作彈窗請求用戶授權(「允許應用讀取文件?」),極其惱人;且**禁止寫入** (拋 SecurityException)。
  • 簽名 MIDlet (可信任第三方/廠商簽名):可配置為「總是允許」讀寫,無彈窗,體驗順暢。
  • Motorola 早期實現 (com.motorola.io.file) 甚至完全封殺未簽名應用讀取。

結論:涉及 FC API 的產品級應用,**務必申請廠商/運營商簽名**,否則幾乎不可用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved