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;}