📄 connectionbaseadapter.java
字号:
protected abstract void disconnect() throws IOException; /** * 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. * * @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 abstract int readBytes(byte b[], int off, int len) throws IOException; /** * Returns the number of bytes that can be read (or skipped over) from * this input stream without blocking by the next caller of a method for * this input stream. The next caller might be the same thread or * another thread. This classes implementation always returns * <code>0</code>. It is up to subclasses to override this method. * * @return the number of bytes that can be read from this input stream * without blocking. * @exception IOException if an I/O error occurs. */ public int available() throws IOException { return 0; } /** * 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. * * @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. */ protected abstract int writeBytes(byte b[], int off, int len) throws IOException; /** * Forces any buffered output bytes to be written out. * The general contract of <code>flush</code> is * that calling it is an indication that, if any bytes previously * written that have been buffered by the connection, * should immediately be written to their intended destination. * <p> * The <code>flush</code> method of <code>ConnectionBaseAdapter</code> * does nothing. * * @exception IOException if an I/O error occurs. */ protected void flush() throws IOException { }}/** * Input stream for the connection */class BaseInputStream extends InputStream { /** Pointer to the connection */ private ConnectionBaseAdapter parent; /** Buffer for single char reads */ byte[] buf = new byte[1]; /** * Constructs a BaseInputStream for a ConnectionBaseAdapter. * * @param parent pointer to the connection object * * @exception IOException if an I/O error occurs. */ BaseInputStream(ConnectionBaseAdapter parent) throws IOException { this.parent = parent; } /** * Check the stream is open * * @exception InterruptedIOException if it is not. */ private void ensureOpen() throws InterruptedIOException { if (parent == null) { throw new InterruptedIOException("Stream closed"); } } /** * Returns the number of bytes that can be read (or skipped over) from * this input stream without blocking by the next caller of a method for * this input stream. The next caller might be the same thread or * another thread. * * <p>The <code>available</code> method always returns <code>0</code> if * {@link ConnectionBaseAdapter#available()} is * not overridden by the subclass. * * @return the number of bytes that can be read from this input stream * without blocking. * @exception IOException if an I/O error occurs. */ public int available() throws IOException { ensureOpen(); return parent.available(); } /** * Reads the next byte of data from the input stream. The value byte is * returned as an <code>int</code> in the range <code>0</code> to * <code>255</code>. If no byte is available because the end of the stream * has been reached, the value <code>-1</code> is returned. This method * blocks until input data is available, the end of the stream is detected, * or an exception is thrown. * * @return the next byte of data, or <code>-1</code> if the end of the * stream is reached. * @exception IOException if an I/O error occurs. */ public int read() throws IOException { if (read(buf, 0, 1) > 0) { return (buf[0] & 0xFF); } return -1; } /** * Reads up to <code>len</code> bytes of data from the input stream into * an array of bytes. An attempt is made to read as many as * <code>len</code> bytes, but a smaller number may be read, possibly * zero. The number of bytes actually read is returned as an integer. * * <p> This method blocks until input data is available, end of file is * detected, or an exception is thrown. * * <p> If <code>b</code> is <code>null</code>, a * <code>NullPointerException</code> is thrown. * * <p> If <code>off</code> is negative, or <code>len</code> is negative, or * <code>off+len</code> is greater than the length of the array * <code>b</code>, then an <code>IndexOutOfBoundsException</code> is * thrown. * * <p> If <code>len</code> is zero, then no bytes are read and * <code>0</code> is returned; otherwise, there is an attempt to read at * least one byte. If no byte is available because the stream is at end of * file, the value <code>-1</code> is returned; otherwise, at least one * byte is read and stored into <code>b</code>. * * <p> The first byte read is stored into element <code>b[off]</code>, the * next one into <code>b[off+1]</code>, and so on. The number of bytes read * is, at most, equal to <code>len</code>. Let <i>k</i> be the number of * bytes actually read; these bytes will be stored in elements * <code>b[off]</code> through <code>b[off+</code><i>k</i><code>-1]</code>, * leaving elements <code>b[off+</code><i>k</i><code>]</code> through * <code>b[off+len-1]</code> unaffected. * * <p> In every case, elements <code>b[0]</code> through * <code>b[off]</code> and elements <code>b[off+len]</code> through * <code>b[b.length-1]</code> are unaffected. * * <p> If the first byte cannot be read for any reason other than end of * file, then an <code>IOException</code> is thrown. In particular, an * <code>IOException</code> is thrown if the input stream has been closed. * * @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. * @see java.io.InputStream#read() */ public int read(byte b[], int off, int len) throws IOException { int test; ensureOpen(); if (len == 0) { return 0; } /* * test the parameters so the subclass will not have to. * this will avoid crashes in the native code */ test = b[off] + b[len - 1] + b[off + len - 1]; return parent.readBytes(b, off, len); } /** * Closes this input stream and releases any system resources associated * with the stream. * * @exception IOException if an I/O error occurs. */ public void close() throws IOException { if (parent != null) { parent.closeInputStream(); parent = null; } }}/** * Output stream for the connection */class BaseOutputStream extends OutputStream { /** Pointer to the connection */ ConnectionBaseAdapter parent; /** Buffer for single char writes */ byte[] buf = new byte[1]; /** * Constructs a BaseOutputStream for an ConnectionBaseAdapter. * * @param p parent connection */ BaseOutputStream(ConnectionBaseAdapter p) { parent = p; } /** * Check the stream is open * * @exception InterruptedIOException if it is not. */ private void ensureOpen() throws InterruptedIOException { if (parent == null) { throw new InterruptedIOException("Stream closed"); } } /** * Writes the specified byte to this output stream. The general * contract for <code>write</code> is that one byte is written * to the output stream. The byte to be written is the eight * low-order bits of the argument <code>b</code>. The 24 * high-order bits of <code>b</code> are ignored. * * @param b the <code>byte</code>. * @exception IOException if an I/O error occurs. In particular, * an <code>IOException</code> may be thrown if the * output stream has been closed. */ public void write(int b) throws IOException { buf[0] = (byte)b; write(buf, 0, 1); } /** * Writes <code>len</code> bytes from the specified byte array * starting at offset <code>off</code> to this output stream. * The general contract for <code>write(b, off, len)</code> is that * some of the bytes in the array <code>b</code> are written to the * output stream in order; element <code>b[off]</code> is the first * byte written and <code>b[off+len-1]</code> is the last byte written * by this operation. * <p> * If <code>b</code> is <code>null</code>, a * <code>NullPointerException</code> is thrown. * <p> * If <code>off</code> is negative, or <code>len</code> is negative, or * <code>off+len</code> is greater than the length of the array * <code>b</code>, then an <tt>IndexOutOfBoundsException</tt> is thrown. * * @param b the data. * @param off the start offset in the data. * @param len the number of bytes to write. * @exception IOException if an I/O error occurs. In particular, * an <code>IOException</code> is thrown if the output * stream is closed. */ public void write(byte b[], int off, int len) throws IOException { int test; int bytesWritten; ensureOpen(); if (len == 0) { return; } /* * test the parameters here so subclases do not have to, * this will avoid a crash in the native code */ test = b[off] + b[len - 1] + b[off + len - 1]; /* * 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. */ for (bytesWritten = 0; ; ) { try { bytesWritten += parent.writeBytes(b, off + bytesWritten, len - bytesWritten); } finally { if (parent == null) { throw new InterruptedIOException("Stream closed"); } } if (bytesWritten == len) { break; } GeneralBase.iowait(); } } /** * Flushes this output stream and forces any buffered output bytes * to be written out. The general contract of <code>flush</code> is * that calling it is an indication that, if any bytes previously * written have been buffered by the implementation of the output * stream, such bytes should immediately be written to their * intended destination. * * @exception IOException if an I/O error occurs. */ public void flush() throws IOException { ensureOpen(); parent.flush(); } /** * Closes this output stream and releases any system resources * associated with this stream. The general contract of <code>close</code> * is that it closes the output stream. A closed stream cannot perform * output operations and cannot be reopened. * * @exception IOException if an I/O error occurs. */ public void close() throws IOException { if (parent != null) { parent.closeOutputStream(); parent = null; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -