首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Java I/O 深入学习( 2)之数组类输入输出流

2012-09-03 
Java I/O 深入学习( 二)之数组类输入输出流1. ByteArrayOutputStream在实例化的时候会创建一个byte类型的

Java I/O 深入学习( 二)之数组类输入输出流

1. ByteArrayOutputStream

在实例化的时候会创建一个byte类型的数组缓冲区,默认32个字节,可以无限增长。可以将内存中的对象读到该数组中。其中write()方法负责往数组中写数据。

实例化时的代码:

/**     * Creates a new byte array output stream. The buffer capacity is      * initially 32 bytes, though its size increases if necessary.      */    public ByteArrayOutputStream() {this(32);    }    /**     * Creates a new byte array output stream, with a buffer capacity of      * the specified size, in bytes.      *     * @param   size   the initial size.     * @exception  IllegalArgumentException if size is negative.     */    public ByteArrayOutputStream(int size) {        if (size < 0) {            throw new IllegalArgumentException("Negative initial size: "                                               + size);        }buf = new byte[size];    }

?写入数据时的代码:

/**     * Writes the specified byte to this byte array output stream.      *     * @param   b   the byte to be written.     */    public synchronized void write(int b) {int newcount = count + 1;if (newcount > buf.length) {            buf = Arrays.copyOf(buf, Math.max(buf.length << 1, newcount));}buf[count] = (byte)b;count = newcount;    }    /**     * Writes <code>len</code> bytes from the specified byte array      * starting at offset <code>off</code> to this byte array output stream.     *     * @param   b     the data.     * @param   off   the start offset in the data.     * @param   len   the number of bytes to write.     */    public synchronized void write(byte b[], int off, int len) {if ((off < 0) || (off > b.length) || (len < 0) ||            ((off + len) > b.length) || ((off + len) < 0)) {    throw new IndexOutOfBoundsException();} else if (len == 0) {    return;}        int newcount = count + len;        if (newcount > buf.length) {            buf = Arrays.copyOf(buf, Math.max(buf.length << 1, newcount));        }        System.arraycopy(b, off, buf, count, len);        count = newcount;    }

2.ByteArrayInputStream

负责把字节数组中的字节以流的形式读出,实现了对同一个字节数组的操作,因此在实例化时需要传入一个byte类型的数据。

实例化代码:

/**     * Creates a <code>ByteArrayInputStream</code>     * so that it  uses <code>buf</code> as its     * buffer array.      * The buffer array is not copied.      * The initial value of <code>pos</code>     * is <code>0</code> and the initial value     * of  <code>count</code> is the length of     * <code>buf</code>.     *     * @param   buf   the input buffer.     */    public ByteArrayInputStream(byte buf[]) {this.buf = buf;        this.pos = 0;this.count = buf.length;    }    /**     * Creates <code>ByteArrayInputStream</code>     * that uses <code>buf</code> as its     * buffer array. The initial value of <code>pos</code>     * is <code>offset</code> and the initial value     * of <code>count</code> is the minimum of <code>offset+length</code>     * and <code>buf.length</code>.     * The buffer array is not copied. The buffer's mark is     * set to the specified offset.     *     * @param   buf      the input buffer.     * @param   offset   the offset in the buffer of the first byte to read.     * @param   length   the maximum number of bytes to read from the buffer.     */    public ByteArrayInputStream(byte buf[], int offset, int length) {this.buf = buf;        this.pos = offset;this.count = Math.min(offset + length, buf.length);        this.mark = offset;    }

?一般情况下我们可以ByteArrayOutputStream和ByteArrayInputStream与ObjectInputStream/ObjectOutputStream或者DataInputStream/DataOutputStream结合使用,在读取对象或者数据类型数据时可以使用,例如以前在设计模式中讲过的原型模式中就有例子。

?

public User deepClone(){try {ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(this);ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bais);return (User)ois.readObject();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}

热点排行