`

io之自定义InputStream

    博客分类:
  • java
阅读更多
package com.laien.io;

import java.io.IOException;
import java.io.InputStream;

/**
 * 自定义InputStream,节点流
 * 
 * @author Administrator
 *
 */
public class MyByteArrayInputStream extends InputStream {
	protected byte[] arr; // 数据源
	protected int ptr = 0; // 当前指针
	protected int mark=0;//标记
	
	/**
	 * 构造函数,接收输入的字节数组
	 * @param arr
	 */
	public MyByteArrayInputStream(byte[] arr) {
		this.arr = arr;	
	}

	/**
	 * 抽象方法,必须实现
	 */
	@Override
	public int read() throws IOException {
		//当读到没有数据后,会返回-1
		return (ptr < arr.length) ? arr[ptr++] : -1;
	}

	/**
	 * 可读数据长度
	 */
	@Override
	public int available() throws IOException {
		return arr.length - ptr;
	}
	
	@Override
	public void close() throws IOException {
		ptr = arr.length;
	}
	/**
	 * 标记,与reset相应
	 */
	@Override
	public synchronized void mark(int readlimit) {
		this.mark = readlimit;
	}
	
	@Override
	public synchronized void reset() throws IOException {
		if (this.mark<0 || this.mark >= arr.length) {
			throw new IOException("标识不对");
		}
		
		ptr = mark;//指针重新指到mark位置,让流可以重新读取
	}
	/**
	 * 重写方法 
	 */
	@Override
	public int read(byte[] b, int off, int len) throws IOException {
		if (ptr >= arr.length || len <0) {
			//流已读完
			return -1;
		}
		
		if (len == 0) {
			return 0;
		}
		
		//处理最后一次读取的时候可能不没有len的长度,取实际长度
		len = available() < len ? available() : len;
		
		System.arraycopy(arr, ptr, b, off, len);
		
		ptr += len;
		//返回读取的长度
		return len;
	}
	
	public static void main(String[] args) throws IOException {
		//测试
		
		byte[] source = new byte[10];
		for (int i=0; i<source.length; i++) {
			source[i] = (byte)i;
		}
		
		MyByteArrayInputStream mis = new MyByteArrayInputStream(source);
		
		byte[] buff = new byte[4];	//
		int len =0;
		while(-1 != (len = mis.read(buff, 0, buff.length))) {
			for (int i=0; i<len; i++) {
				System.out.print(buff[i]);
			}
			System.out.println();
		}
		
	}
	
	
}

 

分享到:
评论

相关推荐

    Java之IO流学习总结

    FilterReader 是所有自定义具体装饰流的父类,其子类PushbackReader 对Reader 对象进行装饰,会增加一个行号。 InputStreamReader 是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader 可以说是一...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--图片之BitMap、Drawable、inputStream及byte[] 互转 |--图片之保存图片至SD卡 |--图片之删除40%最近没有被使用的 |--图片之的本地缓存至SD卡 |--图片之网络异步下载图片 |--图片之获取SD卡所有及边界可调及压缩和...

    廖雪峰 Java 教程.doc

    自定义异常 使用断言 使用JDK Logging 使用Commons Logging 使用Log4j 使用SLF4J和Logback 反射 Class类 访问字段 调用方法 调用构造方法 获取继承关系 动态代理 注解 使用注解 定义注解 处理注解 ...

    Java微信公众平台开发模式+自定义按钮

    首先,想用开放模式需要先成为开发者。成为开发者有两种写法。  一是:通过jsp页面,用out.... import java.io.InputStream; import java.io.PrintWriter; import java.util.Arrays; import javax.servlet.Serv

    zkxbatis:分析mybatis源码,实现自定义简化的mybatis复现

    分析mybatis源码,抽离出最核心的函数,简化mybatis的功能,并且重新设计和复写。以此更加深刻理解mybatis源码。 源码分析 先看测试类: package uestc.zhangkx;...import java.io.InputStream; import jav

    io-lib:具有实用程序的纯Java Modbus实现,可简化串行通信

    io-lib 具有实用程序的纯Java Modbus实现,可简化串行通信 Modbus使用 这可用于将消息发送到从属设备(充当主设备)。 您还可以使用它来接收来自主设备的消息并发送回响应。 该库旨在为Modbus映射提供一种开源的,...

    Android使用Matrix旋转图片模拟碟片加载过程

    今天实现了一个模拟碟片加载过程的小demo,在此展示一下。由于在公司,不好截取动态图片,因此就在这截取两张静态图片看看效果先。 下面简单的将代码列出来。...import java.io.InputStream; import android.co

    Android开发人员不得不收集的代码

    cleanCustomCache : 清除自定义目录下的文件 关闭相关 -&gt; CloseUtils.java closeIO : 关闭 IO closeIOQuietly: 安静关闭 IO 转换相关 -&gt; ConvertUtils.java -&gt; Test bytes2HexString, hexString2Bytes : byteArr ...

    JAVA基础课程讲义

    自定义异常 103 使用异常机制建议 104 总结 105 思考作业 105 上机作业 105 第五章 数组 106 数组概述和特点 106 创建数组和初始化 106 数组常见操作 108 数组的拷贝 108 数组排序 109 多维数组 110 附录(面试前复习...

    【Alluxio分布式存储系统 v2.4.1】以前称为Tachyon+通过公共接口连接众多存储系统

    1、灵活的文件API:Alluxio的本地API类似于java.io.File类,提供了 InputStream和OutputStream的接口和对内存映射I/O的高效支持。我们推荐使用这套API以获得Alluxio的完整功能以及最佳性能。 2、兼容Hadoop HDFS的...

    【Alluxio分布式存储系统 v2.4.1】以前称为Tachyon+通过公共接口连接众多存储系统.zip

    1、灵活的文件API:Alluxio的本地API类似于java.io.File类,提供了 InputStream和OutputStream的接口和对内存映射I/O的高效支持。我们推荐使用这套API以获得Alluxio的完整功能以及最佳性能。 2、兼容Hadoop HDFS的...

    java自学之道

    4.7 自定义异常类 4.8 异常应用的其他问题 4.9 异常应用举例 五、线程 1、线程的概念 1.1 程序、进程与线程 1.2 线程调度与优先级 1.3 线程的状态与生命周期 1.4 控制一个线程生命周期最常用的方法 2、线程的创建...

    Think in Java(中文版)chm格式

    5.1.2 自定义工具库 5.1.3 利用导入改变行为 5.1.4 包的停用 5.2 Java访问指示符 5.2.1 “友好的” 5.2.2 public:接口访问 5.2.3 private:不能接触 5.2.4 protected:“友好的一种” 5.3 接口与实现 5.4 ...

    疯狂JAVA讲义

    学生提问:为什么有栈内存和堆内存之分? 93 4.6.2 基本类型数组的初始化 95 4.6.3 引用类型数组的初始化 96 4.6.4 没有多维数组 99 学生提问:我是否可以让图4.13中灰色覆盖的数组元素再次指向另一个数组?这样...

    JAVA_Thinking in Java

    5.1.2 自定义工具库 5.1.3 利用导入改变行为 5.1.4 包的停用 5.2 Java访问指示符 5.2.1 “友好的” 5.2.2 public:接口访问 5.2.3 private:不能接触 5.2.4 protected:“友好的一种” 5.3 接口与实现 5.4 类访问 ...

    Java初学者入门教学

    5.1.2 自定义工具库 5.1.3 利用导入改变行为 5.1.4 包的停用 5.2 Java访问指示符 5.2.1 “友好的” 5.2.2 public:接口访问 5.2.3 private:不能接触 5.2.4 protected:“友好的一种” 5.3 接口与实现 5.4 类访问 ...

    ThinkInJava

    5.1.2 自定义工具库 5.1.3 利用导入改变行为 5.1.4 包的停用 5.2 Java访问指示符 5.2.1 “友好的” 5.2.2 public:接口访问 5.2.3 private:不能接触 5.2.4 protected:“友好的一种” 5.3 接口与实现 5.4 类访问 ...

    java 编程入门思考

    5.1.2 自定义工具库 5.1.3 利用导入改变行为 5.1.4 包的停用 5.2 Java访问指示符 5.2.1 “友好的” 5.2.2 public:接口访问 5.2.3 private:不能接触 5.2.4 protected:“友好的一种” 5.3 接口与实现 5.4 类访问 ...

Global site tag (gtag.js) - Google Analytics