实现一个我们自己定义的输入流:
参考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;
}
}