Fang.W
          我也是江湖中人,但沒有武功,比的是技術(shù)!——21世紀(jì)的江湖人

           

          一、是否能夠讀寫
          想要自己編寫的程序能夠讀寫文件(注意這里所說的文件不是指jar包中的文件,是指比如手機(jī)內(nèi)存或卡中的文件),
          首先要確認(rèn)程序?qū)⒁惭b的手機(jī)是否支持 JSR75 ;其次還要知道該手機(jī)是否允許未簽名的程序訪問內(nèi)部文件系統(tǒng)。如果
          其中有一個(gè)條件不能滿足,那么程序就無法實(shí)現(xiàn)出文件的讀寫功能了。
          在對(duì)文件系統(tǒng)的操作方面,J2ME提供的功能是很有限的,之所以有這么多的限制,是為了安全著想。J2ME在設(shè)計(jì)之初
          就是為了安全方便的實(shí)現(xiàn)有限功能而設(shè)計(jì)的。所以即便有很多的限制,它的易用性,是很多人傾心于使用它。
          前面說到了一個(gè)軟件“簽名”的問題,其實(shí)是一個(gè)“授權(quán)”的問題。即:在手機(jī)中運(yùn)行的程序是有很多的限制的,如是
          否有訪問網(wǎng)絡(luò)的權(quán)限,是否能夠訪問文件系統(tǒng)等。如果某軟件得到了手機(jī)開發(fā)商/運(yùn)營(yíng)商的簽名授權(quán),則可以得到很多權(quán)限。
          授權(quán)的證書有3個(gè)域,不同的域有不同的權(quán)限。但是有些手機(jī)是可以自己設(shè)置軟件的權(quán)限的,比如我的索愛手機(jī)就可以設(shè)置有
          關(guān)訪問網(wǎng)絡(luò)及文件系統(tǒng)的權(quán)限。

          二、JSR75 介紹
          關(guān)于 JSR75 方面的詳細(xì)內(nèi)容,你可以去看看 SonyEricsson/Nokia/MOTO 提供的開發(fā)包中的幫助文檔,這些幫助文檔中
          都有介紹這個(gè)包。
          JSR75 是為了實(shí)現(xiàn)對(duì)文件系統(tǒng)的操作功能,另外設(shè)計(jì)的,是一個(gè)擴(kuò)展包。在 MIDP API 中是沒有關(guān)于文件讀寫方面的方法
          的。所以在安裝程序之前要確認(rèn)手機(jī)是否支持該包。
          來看看JSR75中有那些內(nèi)容:
          (1)FC API
          javax.microedition.io.file —— 提供對(duì)本地文件系統(tǒng)的訪問功能
                ConnectionClosedException —— 當(dāng)試圖對(duì)一個(gè)已經(jīng)關(guān)閉的 FileConnection 對(duì)象進(jìn)行操作時(shí),會(huì)拋出此異常。
                FileConnection —— 這是一個(gè)很關(guān)鍵的類,基本上文件讀寫都是有該類完成。可以從字面上去理解它的意思。
                FileSystemEventHandler —— 這個(gè)類我也沒用過,不知道它具體的功能。
                FileSystemListener —— 用于監(jiān)聽文件系統(tǒng)目錄狀態(tài)的變化,比如文件的刪除、新增,存儲(chǔ)卡的拔出和插入等。
                FileSystemRegistry —— 用于管理和跟蹤文件系統(tǒng)的監(jiān)聽器,以及可以通過此類過去當(dāng)前所有文件系統(tǒng)的根目錄。
                IllegalModeException —— 文件打開模式異常,當(dāng)試圖寫入以只讀方式打開的文件時(shí),會(huì)拋出該異常。
          (2)PIM API
          javax.microedition.io.pim —— 提供對(duì)個(gè)人信息數(shù)據(jù)的訪問,一般包括名片夾、日歷項(xiàng)和待辦事項(xiàng)。
                此包這次暫不介紹,自己還沒有用過。

          三、根據(jù)程序詳細(xì)介紹有關(guān)文件系統(tǒng)的操作
          1)驗(yàn)證手機(jī)系統(tǒng)是否支持FC API
          我們可以通過系統(tǒng)屬性來驗(yàn)證手機(jī)是否支持 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)的所有根目錄
             * 索愛的機(jī)型,所有的根目錄是: 
             *    e:/
             *    c:/
             *     root1/
             
          */

            Enumeration emun 
          = FileSystemRegistry.listRoots();
            String tmp 
          = "";
            
          while (emun.hasMoreElements()) 
             tmp 
          = emun.nextElement().toString();
             System.out.println(
          "root: " + tmp);
            }

           }


           這方法也是在網(wǎng)上看到的,我試過。但是對(duì)于Nokia的機(jī)型好像不行,即使Nokia支持該類,返回的仍然是null值。我認(rèn)為可能是key不同。請(qǐng)高人指導(dǎo)。

          2)實(shí)現(xiàn) “文件夾創(chuàng)建/文件創(chuàng)建/文件寫入/文件讀取”功能
          注意,當(dāng)我們要進(jìn)入文件系統(tǒng),對(duì)它進(jìn)行操作時(shí),系統(tǒng)會(huì)中斷操作,詢問用戶是否要對(duì)文件系統(tǒng)進(jìn)行操作。所以我們必須使用一個(gè)線程,來進(jìn)行文件系統(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 {
             
          /**
              * 打開一個(gè) 文件/文件夾 ,可以以三種方式打開:READ、READ_WRITE、WRITE。
              * 如果沒有指定第二個(gè)參數(shù),則默認(rèn)為READ_WRITE方式。
              * 注意文件夾的路徑寫法,路徑最后有“/”,則表示打開的是文件夾。
              * 文件路徑的寫法有很多種,這里的路徑寫法適合與索愛的機(jī)型。
              * 比如: MOTO:file:///e/other/notes
              
          */

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

             
          if (!fc.exists()) {
              
          /**
               * 如果不存在,就創(chuàng)建一個(gè)文件夾。
               * 注意此函數(shù)要求文件的打開方式是可寫的,
               * 即用上面的可讀方式,在執(zhí)行到這里會(huì)拋出 IllegalModeException 異常
               * 所以我們應(yīng)該改成Connector.READ_WRITE 方式
               * 也可以用下面的方法:fc.setWritable(true)
               * 但要注意的是,這時(shí)文件就不可讀了,也就是說你再使用fc.exists(),會(huì)拋出異常
               * 所以最好的方法是在打開時(shí)就設(shè)置為Connector.READ_WRITE 方式
               * 還要注意的是,此方法只能創(chuàng)建一層目錄,即,如果other文件夾也不存在,則創(chuàng)建會(huì)失敗
               * 拋出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();
              
          /**
               * 打開輸出流,用于向文件輸出內(nèi)容
               * 要求文件打開方式為可寫
               
          */

              OutputStream out 
          = fc.openOutputStream();
              
          byte[] b = "contents".getBytes("UTF-8");
              out.write(b);
              out.flush();
              out.close();
             }
          else{
              
          /**
               * 打開輸入流,讀取文件中的內(nèi)容
               * 要求文件打開方式為可讀
               
          */

              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幫助文檔 ,里面對(duì)每個(gè)方法都有一些介紹。

          結(jié)束語
          關(guān)于文件系統(tǒng)操作方面的內(nèi)容就介紹到這里,還在學(xué)習(xí)當(dāng)中。有重要發(fā)現(xiàn),會(huì)及時(shí)補(bǔ)充。有不正確的地方,請(qǐng)高手指點(diǎn)!

          posted on 2007-08-07 10:28 Fang.W 閱讀(7037) 評(píng)論(4)  編輯  收藏 所屬分類: J2ME

          FeedBack:
          # re: J2ME程序操作文件系統(tǒng)
          2007-08-07 19:13 | 海邊沫沫
          # re: J2ME程序操作文件系統(tǒng)
          2008-03-23 22:28 | iwinyeah
          實(shí)踐證明,所謂的 String version = System.getProperty("microedition.io.file.FileConnection.version");
          檢測(cè)是多余的!
          原因?
          如果你的手機(jī)不支持FileConnection的話,你就連裝入程序的機(jī)會(huì)都沒有!會(huì)出錯(cuò):ALERT: Unable to load class javax/microedition/io/file/FileConnection  回復(fù)  更多評(píng)論
            
          # re: J2ME程序操作文件系統(tǒng)
          2008-05-29 14:53 | ejoee
          謝謝!!  回復(fù)  更多評(píng)論
            
          # re: J2ME程序操作文件系統(tǒng)
          2009-02-18 17:46 | meaer
          不錯(cuò),不錯(cuò)!  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 庆元县| 秭归县| 马公市| 揭西县| 枣阳市| 青海省| 白朗县| 集安市| 雅安市| 平谷区| 武汉市| 镇雄县| 白朗县| 涿鹿县| 任丘市| 河北省| 广西| 天镇县| 新巴尔虎右旗| 潞西市| 聂荣县| 鄱阳县| 牙克石市| 卢湾区| 太白县| 封开县| 内黄县| 阿拉善左旗| 昆山市| 柯坪县| 嵊泗县| 正宁县| 虹口区| 石门县| 临猗县| 讷河市| 上高县| 阳春市| 中江县| 秦安县| 聂拉木县|