[转]使用FileConnection访问文件系统

来源:互联网 发布:万能数据恢复软件下载 编辑:程序博客网 时间:2024/05/01 18:05

The FileConnection API specified in JSR-75 gives access to the local file systems on devices like PDA. In order to overcome security issues MIDlet needs to include requested file permission in its JAD file under MIDLet-Permission property.The example below has a file browser to move around the file system, select and read images stored in its local image directory.

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))
      {
        // can not go up from MEGA_ROOT
        return;
      }
      currDirName = fileName;
    }
    else if (fileName.equals(UP_DIRECTORY))
    {
      // Go up one directory
      // TODO use setFileConnection when implemented
      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) {}
  }
}


 
原创粉丝点击