现在的位置: 首页 > 综合 > 正文

38、定义一个自己的IO流

2018年02月05日 ⁄ 综合 ⁄ 共 1866字 ⁄ 字号 评论关闭

实现一个我们自己定义的输入流:

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

 

抱歉!评论已关闭.