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()方法的自定义字节数组输入流
2、一个比较全面的例子
参考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; } }
相关文章推荐
- 自己重新定义的一个窗口控件
- java 将一个字符串解析为日期 将日期转为自己定义的格式以字符串输出
- 定义一个我们自己的特殊属性
- Android实现一个自己定义相机的界面
- 用类名做方法的返回值类型 在学习Java的初始阶段,很多同学使用基本数据类型定义变量和引用类型定义变量以及使用类名做方法的返回值类型常常不知所以。今天我以自己的解读方式和个人的理解作一个简单的解释,和
- Jfianl aop 和 利用aop 自己定义一个Service异常
- java中自己定义一个类,类中必须有一个自己定义的构造方法,否则编译系统识别不了
- 与平台无关,实际上是自己定义了一个平台,并与其他平台相连接。
- 关于Go语言,自己定义结构体标签的一个妙用.
- 定义一个员工类,自己分析出几个成员,
- 类里面定义一个指向自己的静态成员指针变量
- //1、有一个字符串开头或结尾含有n个空格(” abcdefgdddd ”),欲去掉前后空格,返回一个新字符串。 //要求1:请自己定义一个接口(函数),并实现功能;70分 //要求2:编写
- 简单编程(十四)定义一个方法能够判断并返回两个整数的最大值,并调用自己的方法测试是否正确。
- 请写一个将整形转换成字符串的函数,函数接口自己定义,如 123 转变成“123”。
- 给phpcms v9加入一个主题radio无线电button,它可反复使用,以创建不同的专题部分内容编辑器,添加一个主题来定义自己的领域
- 对于自己学到的io流的一个简单总结
- Python元类实践--自己定义一个和collections中一样的namedtuple
- 利用泛型自己定义一个简单的集合
- 自己定义一个依赖属性 Wpf
- 在MyEclipse 中添加自己定义的文件模版(----为myeclipse新建一个tapestry 5的tml模板)