randomaccessstream.jpp

来自「This is a resource based on j2me embedde」· JPP 代码 · 共 401 行

JPP
401
字号
/* * * * Copyright  1990-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER *  * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. *  * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). *  * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA *  * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. */package com.sun.midp.io.j2me.storage;import java.io.*;import javax.microedition.io.Connector;import javax.microedition.io.Connection;import com.sun.j2me.security.AccessController;import com.sun.midp.security.SecurityToken;import com.sun.midp.security.Permissions;import com.sun.midp.io.ConnectionBaseAdapter;import com.sun.midp.io.Util;/** A secure storage file stream that can be repositioned. */public class RandomAccessStream extends ConnectionBaseAdapter {    /** Signals the native code to open a truncated file for read-write. */    public static final int READ_WRITE_TRUNCATE = -(Connector.READ_WRITE);    /** Native file handle, set to -1 when not connected. */    private int handle = -1;    /** Constructs a RandomAccessStream. */    public RandomAccessStream() {        AccessController.checkPermission(Permissions.AMS_PERMISSION_NAME);    };    /**     * Constructs a RandomAccess Stream for callers that have a     * different permissions than the currently running MIDlet suite.     *     * @param callerSecurityToken security token of the caller     */    public RandomAccessStream(SecurityToken callerSecurityToken) {        callerSecurityToken.checkIfPermissionAllowed(Permissions.AMS);    };    /**     * Initialize the StreamConnection and return it.     *     * @param name             URL for the connection,     *                         without the protocol part     * @param mode             I/O access mode, see {@link Connector}     * @param timeouts         flag to indicate that the caller     *                         wants timeout exceptions     * @return                 this Connection object     *     * @exception IllegalArgumentException If a parameter is invalid.     * @exception ConnectionNotFoundException If the connection cannot     *                                        be found.     * @exception IOException  If some other kind of I/O error occurs.     */    public Connection openPrim(String name, int mode,                               boolean timeouts) throws IOException {        /*         * This is not class is not for public use but this method is required         * by the super class.         */        throw new SecurityException();    }    /**     * Called to connect a RandomAccessStream to a file in storage.     *     * @param name  contains storage filename     * @param mode  {@link javax.microedition.io.Connector} READ, WRITE,     *              or READ_WRITE     * @exception IOException  if an I/O error occurs     */    public void connect(String name, int mode) throws IOException {        if (handle != -1) {            throw new                IOException("Disconnect the stream before reconnecting.");        }        handle = open(name, mode);        /* This object is re-used by internal methods */        connectionOpen = true;        if (mode == Connector.READ) {            maxOStreams = 0;        } else {            maxOStreams = 1;        }        maxIStreams = 1;    };    /**     * Disconnect the stream.     * <p>     * Any streams obtained with either <code>openInputStream</code> or     * <code>openOutputStream</code> will throw an exception if used after     * this call.     *     * @exception  IOException  if an I/O error occurs when closing the     *                          connection.     */    public void disconnect() throws IOException {        if (handle == -1) {            return;        }        close(handle);        handle = -1;        connectionOpen = false;    };    /**     * Reads up to <code>len</code> bytes of data from the input stream into     * an array of bytes, blocks until at least one byte is available.     * <p>     * Do not use this method if <code>openInputStream</code> has been called     * since the input stream may be buffering data.     *     * @param      b     the buffer into which the data is read.     * @param      off   the start offset in array <code>b</code>     *                   at which the data is written.     * @param      len   the maximum number of bytes to read.     * @return     the total number of bytes read into the buffer, or     *             <code>-1</code> if there is no more data because the end of     *             the stream has been reached.     * @exception  IOException  if an I/O error occurs.     */    public int readBytes(byte b[], int off, int len) throws IOException {        if (len == 0) {            return 0;        }        // Test before we goto the native code        // This expression will cause a ArrayOutOfBoundsException if the values        // passed for offset and numBytes is not valid and is much faster then        // explicitly checking the values with if statements.        int test = b[off] + b[len - 1] + b[off + len - 1];        return read(handle, b, off, len);    };    /**     * Reads up to <code>len</code> bytes of data from the input stream into     * an array of bytes, but does not block if no bytes available.     * <p>     * The <code>readBytesNonBlocking</code> method of     * <code>ConnectionBaseAdapter</code> does nothing and returns 0.     *     * @param      b     the buffer into which the data is read.     * @param      off   the start offset in array <code>b</code>     *                   at which the data is written.     * @param      len   the maximum number of bytes to read.     * @return     the total number of bytes read into the buffer, or     *             <code>-1</code> if there is no more data because the end of     *             the stream has been reached.     * @exception  IOException  if an I/O error occurs.     */    protected int readBytesNonBlocking(byte b[], int off, int len)            throws IOException {        // Read bytes should be non blocking        return readBytes(b, off, len);    };    /**     * Writes <code>len</code> bytes from the specified byte array     * starting at offset <code>off</code> to this output stream.     * <p>     * Polling the native code is done here to allow for simple     * asynchronous native code to be written. Not all implementations     * work this way (they block in the native code) but the same     * Java code works for both.     * <p>     * Do not use this method if <code>openOutputStream</code> has been called     * since the output stream may be buffering data.     *     * @param      b     the data.     * @param      off   the start offset in the data.     * @param      len   the number of bytes to write.     * @return     number of bytes written     * @exception  IOException  if an I/O error occurs. In particular,     *             an <code>IOException</code> is thrown if the output     *             stream is closed.     */    public int writeBytes(byte b[], int off, int len) throws IOException {        if (len == 0) {            return 0;        }        // Test before we goto the native code        // This expression will cause a ArrayOutOfBoundsException if the values        // passed for offset and numBytes is not valid and is much faster then        // explicitly checking the values with if statements.        int test = b[off] + b[len - 1] + b[off + len - 1];        write(handle, b, off, len);        return len;    };    /**     * Write the given stream fully into this one.     *     * @param in stream write from     * @return number of bytes written from the stream     * @exception IOException  if an I/O error occurs     */    public int writeStream(InputStream in) throws IOException {        byte[] temp = new byte[1024];        int bytesRead;        int totalBytesWritten = 0;        for (;;) {            bytesRead = in.read(temp);            if (bytesRead == -1) {                return totalBytesWritten;            }            writeBytes(temp, 0, bytesRead);            totalBytesWritten += bytesRead;        }    }    /**     * Commit pending writes of this stream.     *     * @exception IOException  if an I/O error occurs     */    public void commitWrite() throws IOException {        commitWrite(handle);    }    /**     * Set the absolute position of this stream.     * <p>     * Do not use this method if either <code>openInputStream</code> or     * <code>openOutputStream</code> has been called     * since the streams may be buffering data.     *     * @param absolutePosition position from the byte 0 of this stream     * @exception IOException  if an I/O error occurs     */    public void setPosition(int absolutePosition) throws IOException {        position(handle, absolutePosition);    }    /**     * Get the size of this stream.     *     * @return size of this stream in bytes     * @exception IOException  if an I/O error occurs     */    public int getSizeOf() throws IOException {        return sizeOf(handle);    }    /**     * Truncate the size of the stream to <code>size</code> bytes.     * This method cannot be used to make the size of the     * underlying stream larger.     *     * @param size new size of this stream in bytes     *     * @exception IOException if an I/O error occurs or     *            <code>size</code> is larger than the stream size.     */    public void truncate(int size) throws IOException {        truncateStream(handle, size);    }    /*     * NOTE: open() needs to be non-static so we can use the 'this'     * pointer to register the cleanup routine. When we have full     * native finalization, open() can be made 'static' again.     */    /**     * Open a stream to a native file.     *     * @param filename  filename     * @param mode        {@link javax.microedition.io.Connector} READ, WRITE,     *                    or READ_WRITE     *     * @return handle to a native stream     *     * @exception IOException  if an I/O error occurs     */    private native int open(String filename, int mode) throws IOException;    /**     * Close a native stream.     *     * @param handle native stream handle     *     * @exception IOException  if an I/O error occurs     */    private static native void close(int handle) throws IOException;    /**     * Read at least one byte from a native stream.     *     * @param handle native stream handle     * @param buffer where to put the bytes     * @param offset where in the buffer to starting putting bytes     * @param length how many bytes to read     *     * @return number of bytes read of -1 for the end of stream     *     * @exception IOException  if an I/O error occurs     */    private static native int read(int handle, byte[] buffer, int offset,                                   int length) throws IOException;    /**     * Write bytes to a native stream.     *     * @param handle native stream handle     * @param buffer what bytes write     * @param offset where in the buffer the bytes start     * @param length how many bytes to write     *     * @exception IOException  if an I/O error occurs     */    private static native void write(int handle, byte[] buffer, int offset,                                     int length) throws IOException;    /**     * Commits or flushes pending writes.     *     * @param handle native stream handle     *     * @exception IOException  if an I/O error occurs     */    private static native void commitWrite(int handle) throws IOException;    /**     * Set the current position of a native stream.     *     * @param handle  native stream handle     * @param absolutePosition desired position from the beginning of the     *   stream.     *     * @exception IOException  if an I/O error occurs     */    private static native void position(int handle, int absolutePosition)        throws IOException;    /**     * Get the total size of a native stream.     *     * @param handle  native stream handle     *     * @return size of the stream in bytes     *     * @exception IOException  if an I/O error occurs     */    private static native int sizeOf(int handle) throws IOException;    /**     * Set the size of a native stream.     *     * @param handle native stream handle     * @param size size to truncate the native stream to.     *     * @exception IOException if an I/O error occurs     */    private static native void truncateStream(int handle, int size)        throws IOException;    /**     * Ensures native resources are freed when Object is collected.     */// #ifdef ENABLE_CDC    protected native void finalize();// #else    private native void finalize();// #endif}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?