J2ME 访问本地文件系统

宋健柏
2023-12-01

                                                            J2ME 访问本地文件系统 

 

                      转自网络http://www.drupaling.cn/a/JAVA/J2ME/2009/0917/913.html

                    转子网络http://hi.baidu.com/wind_of_heaven/blog/item/4b61ff88c8f33c93a4c2729c.html

 

一、是否能够读写
想要自己编写的程序能够读写文件(注意这里所说的文件不是指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() ...{

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);
}


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 ...{
 
   fc = (FileConnection) Connector.open(
     "file://localhost/e:/other/notes/", Connector.READ);
 
 
   if (!fc.exists()) ...{
  
    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;

/

 


 

                     J2ME使用FileConnection 访问移动设备的本地文件系统

 


     在JSR-75里定义了FileConnection API,使得支持JSR-75的移动设备(例如PDA)能够访问本地文件系统.由于安全的考虑,必须在MIDLet的JAD文件里边添加MIDLet- Permission属性项并且包括所必需的文件许可才能在MIDlet里正常使用此API.

下边的例子打开一个文件浏览器,浏览、选择和读取存储在本地图像目录里的图像

import java.util.*;
import java.io.*;
import javax.microedition.io.*;
import javax.microedition.io.file.*;
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;

public class FileMidlet extends MIDlet implements CommandListener
{
  private String currDirName;

  private Command view = new Command("View", Command.ITEM, 1);
  private Command back = new Command("Back", Command.BACK, 2);
  private Command exit = new Command("Exit", Command.EXIT, 3);
 
  private final static String UP_DIRECTORY = "..";
  private final static String MEGA_ROOT = "/";
  private final static String SEP_STR = "/";
  private final static char   SEP = '/';

  public FileMidlet()
  {
    currDirName = MEGA_ROOT;
  }

  public void startApp()
  {
    boolean isAPIAvailable = false;
    if (System.getProperty(
      "microedition.io.file.FileConnection.version") != null)
    {
      isAPIAvailable = true;
      try
      {
        showCurrDir();
      }
      catch (SecurityException e)
      {}
      catch (Exception e) {}
      }
    else
    {
      StringBuffer splashText = new StringBuffer(
        getAppProperty("MIDlet-Name")).append("/n").append(
        getAppProperty("MIDlet-Vendor")).
        append(isAPIAvailable?"":"/nFileConnection API not available");
      Alert splashScreen = new Alert(null,splashText.toString(),
        null,AlertType.INFO);
      splashScreen.setTimeout(3000);
      Display.getDisplay(this).setCurrent(splashScreen);
    }
  
  }

  public void pauseApp() {}

  public void destroyApp(boolean cond)
  {
    notifyDestroyed();
  }

  public void commandAction(Command c, Displayable d)
  {
    if (c == view)
    {
      List curr = (List)d;
      final String currFile = curr.getString(curr.getSelectedIndex());
      new Thread(new Runnable()
      {
        public void run()
        {
          if (currFile.endsWith(SEP_STR) ||
            currFile.equals(UP_DIRECTORY))
          {
            traverseDirectory(currFile);
          } else
          {
            showFile(currFile);
          }
        }
      }).start()
    }
    else if (c == back)
    {
      showCurrDir();
    }
    else if (c == exit)
    {
      destroyApp(false);
    }
  }

  void showCurrDir()
  {
    Enumeration e;
    FileConnection currDir = null;
    List browser;
    try
    {
      if (MEGA_ROOT.equals(currDirName))
      {
        e = FileSystemRegistry.listRoots();
        browser = new List(currDirName, List.IMPLICIT);
      }
      else
      {
        currDir = (FileConnection)Connector.open(
          "file://localhost/" + currDirName);
        e = currDir.list();
        browser = new List(currDirName, List.IMPLICIT);
        browser.append(UP_DIRECTORY);
      }
      while (e.hasMoreElements())
      {
        String fileName = (String)e.nextElement();
        if (fileName.charAt(fileName.length()-1) == SEP)
        {
          browser.append(fileName);
        }
        else
        {
          browser.append(fileName);
        }
      }
      browser.setSelectCommand(view);
      browser.addCommand(exit);
      browser.setCommandListener(this);
      if (currDir != null)
      {
        currDir.close();
      }
      Display.getDisplay(this).setCurrent(browser);
    }
    catch (IOException ioe)
    {}
  }
 
  void traverseDirectory(String fileName)
  {
    if (currDirName.equals(MEGA_ROOT))
    {
      if (fileName.equals(UP_DIRECTORY))
      {
        return;
      }
      currDirName = fileName;
    }
    else if (fileName.equals(UP_DIRECTORY))
    {
      int i = currDirName.lastIndexOf(SEP, currDirName.length()-2);
      if (i != -1)
      {
        currDirName = currDirName.substring(0, i+1);
      }
      else
      {
        currDirName = MEGA_ROOT;
      }
    }
    else
    {
      currDirName = currDirName + fileName;
    }
    showCurrDir();
  }
 
  void showFile(String fileName)
  {
    try
    {
      FileConnection fc = (FileConnection)
      Connector.open("file://localhost/" + currDirName + fileName);
      if (!fc.exists())
      {
        throw new IOException("File does not exists");
      }
      InputStream fis = fc.openInputStream();
      byte[] b = new byte[1024];
      int length = fis.read(b, 0, 1024);
      fis.close();
      fc.close();

      TextBox tb = new TextBox("View File: " + fileName, null, 1024,
          TextField.ANY | TextField.UNEDITABLE);
 
      tb.addCommand(back);
      tb.addCommand(exit);
      tb.setCommandListener(this);

      if (length > 0)


      {


        tb.setString(new String(b, 0, length));


      }


      Display.getDisplay(this).setCurrent(tb);


    }


    catch (Exception e) {}


  }


}

 类似资料: