05JavaIO详解_仿照IO源码自己去实现一个IO流(为了加深印象,本身没有价值)
版本会越来越难:
版本1:只写一个read方法
package com.guigu.shen.InputStream; import java.io.IOException;
import java.io.InputStream; import javax.print.attribute.PrintRequestAttribute; //包含main方法。用来做测试的。
public class MyStream { 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 mybyteArrayInputStream=new MybyteArrayInputStream(b);
//死循环,直到把数据读完
while(true)
{
int c=mybyteArrayInputStream.read();
if(c<0)
{
break; }
System.out.println(c+" ");
} } }
class MybyteArrayInputStream extends InputStream
{
//存放要被读取的数据的索引
private byte[] data;
//当前读的位置
private int ptr=0;
//这个构造函数传进来的就是我们要去读取的数据。
public MybyteArrayInputStream(byte[] b) {
//把要读的数据的索引赋给data;
this.data=b; }
//每一次读取一个字节,没有读到返回-1;
@Override
public int read() throws IOException {
//看data里面的数据有没有被读完,没有读完(<data.length)就返回里面的值,读完了,就返回-1; return (ptr<data.length)?(data[ptr++]):-1;
} }
结果:1,2,3,4,5,6、、、、、、15
版本2:有2个read方法。重写了InputStream里面很多方法,基本完整了。
package com.guigu.shen.InputStream; import java.io.IOException;
import java.io.InputStream; public class MyStream2 extends InputStream{
protected byte[] data;
//表示我当前读到的位置
protected int ptr=0;
//表示记住位置,我下一次可以跳到这个位置上
protected int mark=0;
public MyStream2(byte[] b) {
this.data=b;
}
@Override
public int read()
{
return (ptr<data.length)?(data[ptr++]):-1; }
//这个方法返回的是我还有几个数据没有读
@Override
public int available() throws IOException {
//this.data.length表示我要读的数据额长度,ptr表示我已经读到哪里了,两者相减就是还剩下多少没有读
return this.data.length-ptr;
}
@Override
public void close() throws IOException {
//表明我读到最后了
ptr=data.length;
}
//表示我下次可以跳到这个位置上
@Override
public synchronized void mark(int readlimit) {
this.mark=readlimit;
}
//这个方法表示,我调用这个方法呢,就可以回到mark这个位置上。
@Override
public synchronized void reset() throws IOException { if(mark<0||mark>=data.length)
{ throw new IOException("the postion is not valid"); }
ptr=mark; }
//要想使用mark这个功能,就要让这个函数返回ture
@Override
public boolean markSupported() {
return true;
}
//重写第三个read方法,这个方法会调用第一个read()方法
@Override
public int read(byte[] b, int off, int len) throws IOException { //如果已经读到末尾了或者长度小于0,就不行
if(this.ptr>=data.length||len<0)
{
return -1; }
//如果已经读到了ptr,你还要读len这么长,当ptr+len>数据总长度时是不合理的。
if((this.ptr+len)>data.length)
{ //读取剩下的就好了
len=data.length-this.ptr; }
if(len==0)
{
return 0; }
/*
*
* System提供了一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制。
* 其函数原型是: public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
* src:源数组; srcPos:源数组要复制的起始位置; dest:目的数组; destPos:目的数组放置的起始位置; length:复制的长度。
* 注意:src and dest都必须是同类型或者可以进行转换类型的数组.
*
*
*/ //把data数据里面的数据从ptr这个位置开始共len长度拷贝到b这个数组中的off这个位置开始的位置。同过数组拷贝的方式把数组拷贝到外面
System.arraycopy(data, ptr, b, off, len);
//更新已经读到的位置
ptr+=len;
//返回实际读到的长度
return len; } }
到这里,字节流讲完了
05JavaIO详解_仿照IO源码自己去实现一个IO流(为了加深印象,本身没有价值)的更多相关文章
- spring事务详解(三)源码详解
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...
- AlexNet 网络详解及Tensorflow实现源码
版权声明:本文为博主原创文章,未经博主允许不得转载. 1. 图片数据处理 2. 卷积神经网络 2.1. 卷积层 2.2. 池化层 2.3. 全链层 3. AlexNet 4. 用Tensorflow搭 ...
- 干货:Java多线程详解(内附源码)
线程是程序执行的最小单元,多线程是指程序同一时间可以有多个执行单元运行(这个与你的CPU核心有关). 在java中开启一个新线程非常简单,创建一个Thread对象,然后调用它的start方法,一个 ...
- ThreadLocal类详解:原理、源码、用法
以下是本文目录: 1.从数据库连接探究 ThreadLocal 2.剖析 ThreadLocal 源码 3. ThreadLocal 应用场景 4. 通过面试题理解 ThreadLocal 1.从数据 ...
- (二十三)原型模式详解(clone方法源码的简单剖析)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 原型模式算是JAVA中最简单 ...
- 设计模式之 原型模式详解(clone方法源码的简单剖析)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 原型模式算是JAVA中最简单 ...
- 移动端js触摸touch详解(附带案例源码)
移动端触摸滑动原理详解案例,实现过程通过添加DOM标签的触摸事件监听,并计算触摸距离,通过距离坐标计算触摸角度,最后通过触摸角度去判断往哪个方向触摸的. 触摸的事件列表 触摸的4个事件: touchs ...
- 二十三:原型模式详解(clone复制方法源码)
定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 定义比较简单,总结一下是通过实例指定种类,通过拷贝创建对象. 在JAVA语言中使用原型模式是非常 ...
- 广告行业中那些趣事系列8:详解BERT中分类器源码
最新最全的文章请关注我的微信公众号:数据拾光者. 摘要:BERT是近几年NLP领域中具有里程碑意义的存在.因为效果好和应用范围广所以被广泛应用于科学研究和工程项目中.广告系列中前几篇文章有从理论的方面 ...
随机推荐
- CRM Home Grid StyleSet
用户进行到记录列表后,虽然可以通过视图来区分不同条件的记录但是不能重点突出记录的重要性.我们根据客户的需求特别定制了如下解决方案,比如根据记录的状态,字段值 在列表面上把行的背景显示成不同的着色来突出 ...
- 安卓开发_浅谈OptionsMenus(选项菜单)
Android平台下所提供的菜单大体上可分为三类:选项菜单.上下文菜单和子菜单. 当Activity在前台运行时,如果用户按下手机上的Menu键,此时就会在屏幕低端弹出相应的选项菜单.但这个功能需要开 ...
- Android 之 Intent(意图)
Intent是 Android中重要的桥梁之一,它分为显式意图和隐式意图.接下来分别针对这两种意图进行讲解. 显式意图:通过指定一组数据或动作,激活应用内部的 activity:(相比隐式意图,此做法 ...
- OC语言-02-OC语言-基础知识
一.基础语法 1> OC语言和C语言 C语言是面向过程的语言,OC语言是面向对象的语言 OC语言继承了C语言,并增加了面向对象的思想 以下内容只介绍OC语言与C语言的不同之处 2> 关键字 ...
- Linux线程学习(一)
一.Linux进程与线程概述 进程与线程 为什么对于大多数合作性任务,多线程比多个独立的进程更优越呢?这是因为,线程共享相同的内存空间.不同的线程可以存取内存中的同一个变量.所以,程序中的所有线程都可 ...
- Git基本使用命令
整理Git的一些基本使用命令. # 1)克隆代码 boldseas@lian-PC MINGW64 /d/TestGroup $ git clone ssh://git@code.boldseas ...
- 解决tomcat6部署spring4+mybatisJSP页面产生的500错误,控制台报java.lang.NullPointerException的问题
搭建spring4+mybatis+springMVC访问项目时产生异常: 严重: Servlet.service() for servlet jsp threw exception java.lan ...
- 【转】Python开发指南:最佳实践精选
总体原则 价值 “为别人开发你也想要使用的工具.” ——Kenneth Reitz "简洁总是胜过可用." ——Pieter Hintjens "满足90%的使用场景.忽 ...
- java运算符总结
1.算数运算符:+.-.*./.%(加减乘除取余) 2.自增自减:++.-- 3.赋值运算符:=.+=.-=.*=./= 4.关系运算符:>.<.>=.<=.==.!= 逻辑运 ...
- nginx的配置总结
总体而言,nginx的配置比起apache来是要简洁很多,而言容易理解得多的,另外官网的文档也十分的简洁易懂.我们先看一个简化版的配置文件nginx.conf: #user nobody; worke ...