您的位置:首页 > 其它

38、定义一个自己的IO流

2013-01-09 18:43 197 查看
实现一个我们自己定义的输入流:

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


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐