实现一个我们自己定义的输入流:
参考java.io.ByteArrayInputStream的类,它允许以流(stream)的方式依序地读取一个byte array中的內容。如果我们要实现自己的ByteArrayInputStream,首先要继承Inputstream类,然后要实现那个唯一的抽象方法:int read()
先看构造方法,因为是输入流,首先要确定数据源,又因为是字节数组输入流,以一个字节数组为源,定义构造方法:public MyByteArrayInputStream(byte[] b)
对于传入的字节数组,设定一个data成员变量來存储。因为流的性质,我们需要记录目前已读取到的位置,所以设定一个int pt成员变量来加以表示。还需要设定一个mark成员变量,来保存重新设定流的读取位置。
1、一个简单的,只是实现read()方法的自定义字节数组输入流
import java.io.IOException; import java.io.InputStream; public class MyOwnStream { public static void main(String[] args) throws Exception { byte[] b = new byte[16]; for(int i = 0;i < b.length; i++) { b[i] = (byte)i; } MyByteArrayInputStream mbais = new MyByteArrayInputStream(b); while(true) { int c = mbais.read(); if(c < 0) { break; } System.out.print(c + " "); } System.out.println(); } } class MyByteArrayInputStream extends InputStream { protected byte[] data; protected int ptr = 0; public MyByteArrayInputStream(byte[] b) { this.data = b; } @Override public int read() throws IOException { return (ptr < data.length) ? data[ptr++] : -1; } }
2、一个比较全面的例子
import java.io.IOException; import java.io.InputStream; public class MyOwnStream2 extends InputStream { protected byte[] data; protected int ptr = 0; protected int mark = 0; public MyOwnStream2(byte[] b) { this.data = b; } @Override public int read() throws IOException { return (ptr < data.length) ? data[ptr++] : -1; } @Override public int available() throws IOException { return data.length - ptr; } @Override public void close() throws IOException { ptr = data.length; } @Override public synchronized void mark(int readlimit) { this.mark = readlimit; } @Override public synchronized void reset() throws IOException { if(mark < 0 || mark > data.length) { throw new IOException("The Position is not valid"); } ptr = mark; } @Override public boolean markSupported() { return true; } @Override public int read(byte[] b, int off, int len) throws IOException { if(this.ptr >= data.length || len < 0) { return -1; } if((this.ptr + len)> data.length ) { len = data.length - this.ptr; } if(len == 0) { return 0; } System.arraycopy(data, ptr, b, off, len); ptr += len; return len; } }