À¸Ä¿Áбí
 
 
Ê×Ò³ > ³ÌÐòÉè¼Æ > Java > RMS´ÓÈëÃŵ½¾«Í¨Ö®Èý
 

RMS´ÓÈëÃŵ½¾«Í¨Ö®Èý

ÈÕÆÚ£º2006-04-13 21:58:56  À´Ô´£ºj2medev.com
ÇëÄú¼Çס˼Ë÷ÍøµÄÍøÖ·£º http://www.4so.net  [¼ÓÈëÊղؼÐ]

    Ç°ÃæÁ½ÆªÎÄÕÂÏêϸµÄ½éÉÜÁËRecord Management SystemµÄ»ù±¾¸ÅÄîÒÔ¼°¶ÔÏóÐòÁл¯µÄÎÊÌ⣬ÏÖÔÚÎÒÃÇÖ÷Òª½éÉܹØÓÚRecordStoreÀàµÄʹÓã¬ÔÚSUNµÄÍøÕ¾ÌṩÁËÒ»¸öRMSAnalyzerÀ࣬Äã¿ÉÒÔ°ÑËûÓÃÔÚÄãµÄÏîÄ¿ÖÐÀ´µ÷ÊÔÄãµÄ³ÌÐò¡£

Record Store Discovery
       Äã¿ÉÒÔͨ¹ýµ÷ÓÃRecordStore.listRecordStores()À´µÃµ½MIDlet suitesÖеÄRecord Store,Õâ¸ö¾²Ì¬·½·¨·µ»ØÒ»¸öStringÀàÐ͵ÄÊý×飬ÿ¸ö´ú±íRecord StoreµÄÃû×Ö£¬Èç¹ûûÓÐrecord StoreÄÇô»á·µ»Ønull,·½·¨RMSAnalyzer.annlyzeAll()ͨ¹ýµ÷ÓÃlistRecordStores()µÃµ½Record StoreÈ»ºóͨ¹ý·½·¨analyze()·ÖÎöÿ¸öRecord Store.

public void analyzeAll(){

    String[] names = RecordStore.listRecordStores();

    for( int i = 0;                                           

         names != null && i < names.length;

         ++i ){

        analyze( names[i] );

    }

}

×¢Òâµ½ÁгöµÄÊý×éÃû×ÖÊÇËùÊôMIDlet suiteµÄRecord Store¡£MIDPÖÐûÓÐÌṩÁоٳöÈÎºÎÆäËûMIDlet suitesµÄRecord StoreµÄ·½·¨£¬ÔÚMIDP 1.0ÖÐRecord StoreÔÚËùÊôMIDlet suitesÍâÊDz»¿É¼ûµÄ£¬ÔÚMIDP 2.0ÖУ¬MIDlet suite¿ÉÒÔÖ¸¶¨Ò»¸öRecord Store×÷Ϊ¿É¹²ÏíµÄ£¬µ«ÊÇÆäËûµÄsuiteÒªÖªµÀËûµÄÃû×ֲſÉÒÔ·ÃÎÊËü¡£

Opening and closing Record Store
       RecordStore.openRecordStore()ÊÇÓÃÀ´´ò¿ªÒ»¸öRecord StoreµÄ£¬ËüÒ²¿ÉÒÔÓÃÀ´´´½¨Ò»¸öRecord Store£¬Õâ¸ö¾²Ì¬·½·¨·µ»ØÒ»¸öRecord StoreµÄ¶ÔÏó£¬ÏÂÃæÊÇRMSAnalyzer.analyze()¡£

public void analyze( String rsName ){

    RecordStore rs = null;

    try {

        rs = RecordStore.openRecordStore( rsName, false );

        analyze( rs ); // call overloaded method

    } catch( RecordStoreException e ){

        logger.exception( rsName, e );

    } finally {

        try {

            rs.closeRecordStore();

        } catch( RecordStoreException e ){

            // Ignore this exception

        }

    }

}

openRecordStore()µÄµÚ¶þ¸ö²ÎÊý±íʾÈç¹ûrecord store²»´æÔÚÊDz»ÊÇ´´½¨Ðµģ¬ÔÚMIDP2.0ÖУ¬Èç¹ûÄãÏë´ò¿ªÒ»¸öÔÚÆäËûµÄMIDlet suiteÀïÃæ´´½¨µÄRecord StoreµÄ»°Ó¦¸ÃÓÃÏÂÃæµÄ·½·¨¡£

...

String name = "mySharedRS";

String vendor = "EricGiguere.com";

String suite = "TestSuite";

RecordStore rs =

      RecordStore.openRecordStore( name, vendor, suite );

...

vendorºÍsuiteµÄÃû×ÖÓ¦¸ÃºÍMIDlet suiteµÄmanifestºÍjadµÄÄÚÈÝÒ»Ö¡£

µ±ÄãÍê³ÉÁ˶Ôrecord storeµÄ²Ù×÷ÒÔºóÓ¦¸Ãµ÷ÓÃRecordStore.closeRecordStore()À´¹Ø±ÕËü£¬Ò»¸öRecordStoreµÄʵÀýÔÚÒ»¸öMIDlet suiteÀïÃæÊÇΨһµÄ£¬Èç¹ûÒÔͬÑùµÄÃû×ÖÔٴε÷ÓÃopenRecordStore()µÄ»°»á·µ»ØÍ¬ÑùµÄʵÀý£¬ÕâÑù¶à¸öMIDletÔÚ¹²ÏíÒ»¸örecord store£¬Ã¿¸örecord store»á¸ú×ÙËü±»´ò¿ªµÄ´ÎÊý£¬Õâ¸örecord storeÖ±µ½±»µ÷ÓÃÏàͬ´ÎÊýµÄcloseRecordStore()ºó²Å»á³¹µ×µÄ¹Ø±Õ£¬¶ÔÒ»¸öÒѾ­¹Ø±ÕµÄRecord Store½øÐвÙ×÷»áµ¼ÖÂÅ׳ö

RecordStoreNotOpenException¡£

Creating Record Store
       ´´½¨Ò»¸ö˽ÓеÄrecord store£¬°ÑµÚ¶þ¸ö²ÎÊýÉèÖÃΪtrueµ÷ÓÃopenRecordStore()£¬...

// Create a record store

RecordStore rs = null;

try {

    rs = RecordStore.openRecordStore( "myrs", true );

} catch( RecordStoreException e ){

    // couldn't open it or create it

}

Èç¹ûÒª´´½¨Ò»¸ö¿É¹²ÏíµÄrecord store£¬ÄÇôʹÓÃËĸö²ÎÊý±äÁ¿µÄopenRecordStore()

int     authMode = RecordStore.AUTHMODE_ANY;

boolean writable = true;

rs = RecordStore.openRecordStore( "myrs", true,

       authMode, writable );

µ±µÚ¶þ¸ö²ÎÊýÊÇtrue²¢ÇÒrecord store²»´æÔÚµÄʱºò£¬ºóÃæÁ½¸ö²ÎÊý¿ØÖÆËûµÄÊÚȨģʽºÍ¿ÉдÐÔ£¬ÊÚȨģʽ¾ö¶¨ÊÇ·ñÆäËûµÄMIDlet suite¾ßÓзÃÎÊrecord storeµÄȨÏÞ£¬Á½ÖÖ¿ÉÄܵÄģʽÊÇRecordStore.AUTHMODE_PRIVATE(Ö»ÓÐÓµÓеÄSUITE²Å¿ÉÒÔ·ÃÎÊ)ºÍRecordStore.AUTHMODE_ANY£¨ÈκÎsuite¶¼¿ÉÒÔ·ÃÎÊ£©£¬¿ÉдÐÔ¿ØÖÆ×ÅÊÇ·ñÆäËûµÄsuiteÄܹ»ÐÞ¸Ärecord store£¬Èç¹ûfalseµÄ»°£¬ÄÇôֻÓÐËùÊôsuite²Å¿ÉÒÔÐ޸쬯äËûµÄÖ»ÄܶÁÈ¡¡£×¢ÒâËùÊôsuite¿ÉÒÔÔÚÈκÎʱºòµ÷ÓÃRecordStore.setMode()À´ÐÞ¸ÄËüµÄÊÚȨºÍ¶Áдģʽ£¬ÀýÈ磺

rs.setMode( RecordStore.AUTHMODE_ANY, false );ÊÂʵÉÏ×îºÃÊÇ´´½¨Ò»¸örecord store,ÊÚȨģʽΪRecordStore.AUTHMODE_PRIVATE¡£

Adding and updating records
       ¼Ç¼¾ÍÊÇ×Ö½ÚÊý×飬Äã¿ÉÒÔͨ¹ýµ÷ÓÃRecordStore.addRecord()À´Ìí¼ÓÒ»¸öеļǼµ½Ò»¸ö´ò¿ªµÄRecord Store

byte[] data = new byte[]{ 0, 1, 2, 3 };

int    recordID;
recordID = rs.addRecord( data, 0, data.length );

Èç¹ûµÚÒ»¸ö²ÎÊýÊÇnullµÄ»°£¬ÄÇôÄã¾ÍÄÜÌí¼ÓÒ»¸ö¿Õ¼Ç¼¡£µÚ¶þ¸öºÍµÚÈý¸ö²ÎÊý˵Ã÷ÁË×Ö½ÚÊý×éµÄÆðµãºÍ´ÓÆðµã¿ªÊ¼µÄ×ܵÄ×Ö½ÚÊý¡£Èç¹ûÌí¼Ó³É¹¦»á·µ»ØÐ¼Ç¼µÄrecord ID,Èç¹ûʧ°Ü»áÅ׳öÒì³££¬ÀýÈçRecordStoreFullException¡£

     Í¨¹ýµ÷ÓÃRecordStore.setRecord()¿ÉÒÔÔÚÈκÎʱºò¸üмǼµÄÄÚÈÝ¡£

int    recordID = ...; // some record ID

byte[] data = new byte[]{ 0, 10, 20, 30 };

rs.setRecord( recordID, data, 1, 2 );

    // replaces all data in record with 10, 20

Äã²»ÄÜ´ó¿éµÄÌí¼Ó¼Ç¼£¬±ØÐëÊ×ÏȰѼǼת»»³ÉÊý×飬Ȼºóµ÷ÓÃÌí¼ÓµÄº¯Êý£¬Í¨¹ýµ÷ÓÃRecordStore.getNextRecordID()Äã¿ÉÒԵõ½Ï´ε÷ÓÃaddRecord()½«ÒªµÃµ½µÄrecord ID,Õâ¸öÖµ±ÈÏÖÔÚʹÓõÄÈκÎÖµ¶¼´ó¡£

Reading records
       ÏëÒª¶ÁÈ¡¼Ç¼£¬ÓÐÁ½ÖÖ·½·¨¡£µÚÒ»ÊÇ·ÖÅäºÏÊÊ´óСµÄÊý×éÈ»ºó°Ñ¼Ç¼µÄÄÚÈݸ´ÖƹýÈ¥¡£

int    recordID = .... // some record ID

byte[] data = rs.getRecord( recordID );

µÚ¶þÖÖ·½·¨ÊǰÑÊý×鏴֯µ½Ô¤ÏÈ·ÖÅäµÄ×Ö½ÚÊý×éÖУ¬Ö¸¶¨¸´ÖÆµÄÆðµã²¢·µ»Ø¸´ÖƵÄ×Ö½ÚÊýÄ¿¡£

int    recordID = ...; // some record ID

byte[] data = ...; // an array

int    offset = ...; // the starting offset

int numCopied = rs.getRecord( recordID, data, offset );

Êý×éµÄ´óС±ØÐëÄÜ×ã¹»ÈÝÄÉÊý¾Ý£¬·ñÔò»áÅ׳öjava.lang.ArrayIndexOutOfBoundsException.ʹÓÃRecordStore.getRecordSize()À´·ÖÅäÊý×é¿Õ¼äÊǺÏÊʵķ½·¨¡£ÊÂʵÉϵÚÒ»¸ö·½·¨µÈ¼ÛÓë

byte[] data = new byte[rs.getRecordSize(recordID)];

rs.getRecord(recordID,data,0);

µÚ¶þÖÖ·½·¨ÓÐÀûÓÚ¼õСÄÚ´æµÄ·ÖÅ䣬µ±ÄãÒª±éÀúÒ»×é¼Ç¼µÄʱºò£¬Äã¿ÉÒÔ½áºÏgetNextRecordID()ºÍgetRecordSize()À´Íê³ÉÔËËãÁ¿ºÜ´óµÄËÑË÷¡£

int    nextID = rs.getNextRecordID();

byte[] data = null;

for( int id = 0; id < nextID; ++id ){

    try {

        int size = rs.getRecordSize( id );

       if( data == null || data.length < size ){

            data = new byte[ size ];

        }

        rs.getRecord( id, data, 0 );

        processRecord( rs, id, data, size ); // process it

    } catch( InvalidRecordIDException e ){

        // ignore, move to next record

    } catch( RecordStoreException e ){

        handleError( rs, id, e ); // call an error routine

    }

}

¸üºÃµÄ°ì·¨ÊÇʹÓÃRecordStore.enumerateRecords()À´±éÀú¼Ç¼¡£

Deleting Records and Record Stores
       Äã¿ÉÒÔͨ¹ýµ÷ÓÃRecordStore.deleteRecord()À´É¾³ý¼Ç¼

int recordID = ...; // some record ID

rs.deleteRecord( recordID );

Ò»µ©¼Ç¼±»É¾³ý£¬ÈκζԼǼµÄ²Ù×÷½«»áµ¼ÖÂÅ׳öInvalidRecordIDException£¬Í¨¹ýµ÷ÓÃRecordStore.deleteRecordStore()À´É¾³ýRecord Store.

try {

    RecordStore.deleteRecordStore( "myrs" );

} catch( RecordStoreNotFoundException e ){

    // no such record store

} catch( RecordStoreException e ){

    // somebody has it open

}

Record StoreÖ»ÄÜÔÚûÓдò¿ªµÄʱºò±»ËùÊôµÄsuiteµÄMIDletɾ³ý¡£

ÆäËû²Ù×÷
       getLastModified()·µ»Ø×îºóÐÞ¸Ärecord storeµÄʱ¼ä£¬¸ñʽºÍSystem.currentTimeMillis()Ò»Ñù¡£

       getName()µÃµ½record storeµÄÃû×Ö¡£

       getNumRecords()·µ»Ørecord storeÖмǼµÄÊýÁ¿¡£

       getSize()·µ»Ørecord storeµÄÕû¸ö´óС£¬°üÀ¨¼Ç¼µÄ´óСºÍϵͳÀ´ÊµÏÖrecord storeµÄ¿Õ¼ä¡£

       getSizeAvailable()·µ»Ørecord storeÖл¹ÄÜÓõĿռ䣬

       getVersion()·µ»Ørecord storeµÄ°æ±¾Êý£¬Õâ¸öÊý´óÓÚ0£¬Ã¿´Îrecord store±»Ð޸ģ¬Õâ¸öÊý¶¼»á×Ô¶¯Ôö¼Ó¡£

       Ò»¸öMIDletÄܹ»Í¨¹ý×¢²áÒ»¸ö¼àÌýÆ÷À´¸ú×Ùrecord store,ͨ¹ýaddRecordListener()ºÍdeleteRecordListener()¡£

The RMSAnalyzer class
×îºóÎÒÃÇÌṩһ¸ö·ÖÎörecord storeµÄÀ࣬Äã¿ÉÒÔÕâÑùʹÓÃËü¡[/!--empirenews.page--]£

RecordStore rs = ...; // open the record store

RMSAnalyzer analyzer = new RMSAnalyzer();

analyzer.analyze( rs );

ͨ³£·ÖÎöÊä³öµ½System.out£¬ÑùʽÈçÏÂËùʾ£º

=========================================

Record store: recordstore2

    Number of records = 4

    Total size = 304

    Version = 4

    Last modified = 1070745507485

    Size available = 975950

 

Record #1 of length 56 bytes

5f 62 06 75 2e 6b 1c 42 58 3f  _b.u.k.BX?

1e 2e 6a 24 74 29 7c 56 30 32  ..j$t)|V02

5f 67 5a 13 47 7a 77 68 7d 49  _gZ.Gzwh}I

50 74 50 20 6b 14 78 60 58 4b  PtP k.x`XK

1a 61 67 20 53 65 0a 2f 23 2b  .ag Se./#+

16 42 10 4e 37 6f              .B.N7o   

Record #2 of length 35 bytes

22 4b 19 22 15 7d 74 1f 65 26  "K.".}t.e&

4e 1e 50 62 50 6e 4f 47 6a 26  N.PbPnOGj&

31 11 74 36 7a 0a 33 51 61 0e  1.t6z.3Qa.

04 75 6a 2a 2a                 .uj**    

Record #3 of length 5 bytes

47 04 43 22 1f                 G.C".    

Record #4 of length 57 bytes

6b 6f 42 1d 5b 65 2f 72 0f 7a  koB.[e/r.z

2a 6e 07 57 51 71 5f 68 4c 5c  *n.WQq_hL

1a 2a 44 7b 02 7d 19 73 4f 0b  .*D{.}.sO.

75 03 34 58 17 19 5e 6a 5e 80  u.4X..^j^?

2a 39 28 5c 4a 4e 21 57 4d 75  *9(JN!WMu

80 68 06 26 3b 77 33           ?h.&;w3  

Actual size of records = 153

-----------------------------------------

ÕâÖÖÑùʽ·½±ãÔÚwtkÖÐÏÔʾ£¬ÔÚʵ¼ÊµÄÉ豸ÖнøÐвâÊÔµÄʱºò£¬Äã¿ÉÄÜÏ£Íû°Ñ·ÖÎöÊä³öµ½´®¿Ú»òÕßͨ¹ýÍøÂç·¢µ½servlet£¬Äã¿ÉÒÔͨ¹ý¶¨Òå×Ô¼ºµÄÀàʵÏÖʵÏÖLogger½Ó¿Ú£¬È»ºó°ÑÕâ¸öÀà×÷ΪRMSAnalyzer¹¹ÔìÆ÷µÄ²ÎÊý¡£ÏÂÃæÊÇÔ´´úÂë¡£

package com.ericgiguere;

import java.io.*;

import javax.microedition.rms.*;

// Analyzes the contents of a record store.

// By default prints the analysis to System.out,

// but you can change this by implementing your

// own Logger.

public class RMSAnalyzer {

    // The logging interface.

    public interface Logger {

        void logEnd( RecordStore rs );

        void logException( String name, Throwable e );

        void logException( RecordStore rs, Throwable e );

        void logRecord( RecordStore rs, int id,

                        byte[] data, int size );

        void logStart( RecordStore rs );

    }

    private Logger logger;

    // Constructs an analyzer that logs to System.out.

    public RMSAnalyzer(){

        this( null );

    }

    // Constructs an analyzer that logs to the given logger.

    public RMSAnalyzer( Logger logger ){

        this.logger = ( logger != null ) ? logger :

                                           new SystemLogger();

    }

   // Open the record stores owned by this MIDlet suite

    // and analyze their contents.

    public void analyzeAll(){

        String[] names = RecordStore.listRecordStores();

        for( int i = 0;

             names != null && i < names.length;

             ++i ){

            analyze( names[i] );

        }

    }

    // Open a record store by name and analyze its contents.

    public void analyze( String rsName ){

        RecordStore rs = null;

        try {

            rs = RecordStore.openRecordStore( rsName, false );

            analyze( rs );

        } catch( RecordStoreException e ){

            logger.logException( rsName, e );

        } finally {

            try {

                rs.closeRecordStore();

            } catch( RecordStoreException e ){

                // Ignore this exception

            }

        }

    }

    // Analyze the contents of an open record store using

    // a simple brute force search through the record store.

    public synchronized void analyze( RecordStore rs ){

        try {

            logger.logStart( rs );

            int    lastID = rs.getNextRecordID();

            int    numRecords = rs.getNumRecords();

            int    count = 0;

            byte[] data = null;

            for( int id = 0;

                 id < lastID && count < numRecords;

                 ++id ){

                try {

                    int size = rs.getRecordSize( id );

                    // Make sure data array is big enough,

                    // plus add some for growth

                   if( data == null || data.length < size ){

                        data = new byte[ size + 20 ];

                    }

                    rs.getRecord( id, data, 0 );

                    logger.logRecord( rs, id, data, size );

                    ++count; // only increase if record exists

                }

                catch( InvalidRecordIDException e ){

                    // just ignore and move to the next one

                }

                catch( RecordStoreException e ){

                    logger.logException( rs, e );

                }

            }

        } catch( RecordStoreException e ){

            logger.[/!--empirenews.page--]logException( rs, e );

        } finally {

            logger.logEnd( rs );

        }

    }

    // A logger that outputs to a PrintStream.

    public static class PrintStreamLogger implements Logger {

        public static final int COLS_MIN = 10;

        public static final int COLS_DEFAULT = 20;

         private int   cols;

        private int  numBytes;

        private StringBuffer hBuf;

        private StringBuffer cBuf;

        private StringBuffer pBuf;

        private PrintStream  out;

         public PrintStreamLogger( PrintStream out ){

            this( out, COLS_DEFAULT );

        }

         public PrintStreamLogger( PrintStream out, int cols ){

this.out = out;

            this.cols = ( cols > COLS_MIN ? cols : COLS_MIN );

        }

         private char convertChar( char ch ){

            if( ch < 0x20 ) return '.';

            return ch;

        }

         public void logEnd( RecordStore rs ){

            out.println( "nActual size of records = "

                         + numBytes );

            printChar( '-', cols * 4 + 1 );

             hBuf = null;

            cBuf = null;

            pBuf = null;

        }

         public void logException( String name, Throwable e ){

            out.println( "Exception while analyzing " +

                         name + ": " + e );

        }

         public void logException( RecordStore rs, Throwable e ){

            String name;

             try {

                name = rs.getName();

            } catch( RecordStoreException rse ){

                name = "";

            }

             logException( name, e );

        }

         public void logRecord( RecordStore rs, int id,

                               byte[] data, int len ){

            if( len < 0 && data != null ){

                len = data.length;

            }

            hBuf.setLength( 0 );

            cBuf.setLength( 0 );

             numBytes += len;

             out.println( "Record #" + id + " of length "

                         + len + " bytes" );

             for( int i = 0; i < len; ++i ){

                int    b = Math.abs( data[i] );

                String hStr = Integer.toHexString( b );

                 if( b < 0x10 ){

                    hBuf.append( '0');

                }

                 hBuf.append( hStr );

                hBuf.append( ' ' );

                 cBuf.append( convertChar( (char) b ) );

                 if( cBuf.length() == cols ){

                    out.println( hBuf + " " + cBuf );

                     hBuf.setLength( 0 );

                    cBuf.setLength( 0 );

                }

            }

             len = cBuf.length();

             if( len > 0 ){

                while( len++ < cols ){

                    hBuf.append( "   " );

                    cBuf.append( ' ' );

                }

                 out.println( hBuf + " " + cBuf );

            }

        }

         public void logStart( RecordStore rs ){

            hBuf = new StringBuffer( cols * 3 );

            cBuf = new StringBuffer( cols );

            pBuf = new StringBuffer();

             printChar( '=', cols * 4 + 1 );

             numBytes = 0;

            try {

                out.println( "Record store: "

                             + rs.getName() );

                out.println( "    Number of records = "

                             + rs.getNumRecords() );

                out.println( "    Total size = "

                             + rs.[/!--empirenews.page--]getSize() );

                out.println( "    Version = "

                             + rs.getVersion() );

                out.println( "    Last modified = "

                             + rs.getLastModified() );

                out.println( "    Size available = "

                             + rs.getSizeAvailable() );

                out.println( "" );

            } catch( RecordStoreException e ){

                logException( rs, e );

    }

        }

         private void printChar( char ch, int num ){

            pBuf.setLength( 0 );

            while( num-- > 0 ){

                pBuf.append( ch );

            }

            out.println( pBuf.toString() );

        }

    }

    // A logger that outputs to System.out.

    public static class SystemLogger extends PrintStreamLogger
   {

        public SystemLogger(){

            super( System.out );

        }

        public SystemLogger( int cols ){

            super( System.out, cols );

        }

    }

 

 
 
ÈÈÃÅÐÅÏ¢
 
Ïà¹ØÎÄÕÂ
 
    ÎÞÏà¹ØÐÅÏ¢