Java 日看一类(48)之IO包中的PushbackInputStream

Java深入解析篇十五之IO体系详解 Java I/O(Input/Output)是java.io包中提供的一套用于数据输入和输出的API体系。它通过流(Stream)的概念,将数据的读取和写入抽象为统一的接口操作,屏蔽了底层数据源(文件、网络、内存等)的差异。/*** 自定义装饰器:统计读取字节数super(in);if(result! 阅读详情

该类继承自FilterInputStream

没有引入包




该类的类头注释如下:

/**
 * A <code>PushbackInputStream</code> adds
 * functionality to another input stream, namely
 * the  ability to "push back" or "unread"
 * one byte. This is useful in situations where
 * it is  convenient for a fragment of code
 * to read an indefinite number of data bytes
 * that  are delimited by a particular byte
 * value; after reading the terminating byte,
 * the  code fragment can "unread" it, so that
 * the next read operation on the input stream
 * will reread the byte that was pushed back.
 * For example, bytes representing the  characters
 * constituting an identifier might be terminated
 * by a byte representing an  operator character;
 * a method whose job is to read just an identifier
 * can read until it  sees the operator and
 * then push the operator back to be re-read.
 *
 * @author  David Connelly
 * @author  Jonathan Payne
 * @since   JDK1.0
 */

大意如下:

PushbackInputStream为其他输入流添加了新功能,该功能提供了回推和取消读取一个字节的能力

在片段代码需要读取由特定分隔符分隔的不确定大小的数据时是很方便和有用的

在读到终止字符后,该代码片段可以取消读取该字符,因此下一个read操作将会重复读取被回推的该byte

例如,表示构成标识符字符的字节可能由表示操作符字符的字节终止;用于读取一个标识符的方法可以读取到遇到操作符为止,然后将该操作符推回以进行重读



该类含有如下的成员变量:

读取缓冲区

protected byte[] buf;

读取标志位:

protected int pos;




该类含有如下的成员方法:

检测流有效状态

private void ensureOpen() throws IOException {
    if (in == null)
        throw new IOException("Stream closed");
}

构造函数(给予输入流和缓冲区大小

public PushbackInputStream(InputStream in, int size) {
    super(in);
    if (size <= 0) {
        throw new IllegalArgumentException("size <= 0");
    }
    this.buf = new byte[size];
    this.pos = size;
}

构造函数(默认缓冲区大小为1

public PushbackInputStream(InputStream in) {
    this(in, 1);
}

读取方法(读出一个字节数据

public int read() throws IOException {
    ensureOpen();
    if (pos < buf.length) {//当前缓冲区不为空
        return buf[pos++] & 0xff;
    }
    return super.read();//缓冲区为空直接从流中读取
}

读取方法(读出数组数据

public int read(byte[] b, int off, int len) throws IOException {
    ensureOpen();
    if (b == null) {
        throw new NullPointerException();
    } else if (off < 0 || len < 0 || len > b.length - off) {
        throw new IndexOutOfBoundsException();
    } else if (len == 0) {
        return 0;
    }

    int avail = buf.length - pos;//缓冲区剩余数据
    if (avail > 0) {//缓冲区不为空
        if (len < avail) {//需要读取长度小于剩余长度
            avail = len;
        }
        System.arraycopy(buf, pos, b, off, avail);
        pos += avail;//修改读取指针
        off += avail;//修改数组偏移量
        len -= avail;//修改剩余需读取长度
    }
    if (len > 0) {
        len = super.read(b, off, len);//直接从流中读取剩余数据
        if (len == -1) {//流已关闭,数据发送完毕
            return avail == 0 ? -1 : avail;
        }
        return avail + len;
    }
    return avail;//返回实际读取长度
}

推回字节数据(推回到缓冲区

public void unread(int b) throws IOException {
    ensureOpen();
    if (pos == 0) {//无法推回,缓冲区已满
        throw new IOException("Push back buffer is full");
    }
    buf[--pos] = (byte)b;
}

推回字节数据(推回一个数组

public void unread(byte[] b, int off, int len) throws IOException {
    ensureOpen();
    if (len > pos) {//缓冲区无用空间小于推回长度
        throw new IOException("Push back buffer is full");
    }
    pos -= len;
    System.arraycopy(b, off, buf, pos, len);
}

推回数组

public void unread(byte[] b) throws IOException {
    unread(b, 0, b.length);
}

返回可无阻塞读取的数据量

public int available() throws IOException {
    ensureOpen();
    int n = buf.length - pos;
    int avail = super.available();
    return n > (Integer.MAX_VALUE - avail)//返回缓冲区有效值与流中有效值的和和int最大值中较小的值
                ? Integer.MAX_VALUE
                : n + avail;
}

跳过后续的字节

public long skip(long n) throws IOException {
    ensureOpen();
    if (n <= 0) {
        return 0;
    }

    long pskip = buf.length - pos;//缓冲区可跳过的数据值
    if (pskip > 0) {
        if (n < pskip) {//可直接跳过
            pskip = n;
        }
        pos += pskip;//修改缓冲区偏移量
        n -= pskip;//修改剩余需跳过数据
    }
    if (n > 0) {
        pskip += super.skip(n);//直接从流中跳过剩余数据
    }
    return pskip;//返回实际需要跳过的值
}

是否支持标记回滚操作(不支持

public boolean markSupported() {
    return false;
}

标记操作(当然为空

public synchronized void mark(int readlimit) {
}

回滚操作(当然也为空

public synchronized void reset() throws IOException {
    throw new IOException("mark/reset not supported");
}

关闭流

public synchronized void close() throws IOException {
    if (in == null)
        return;
    in.close();//内嵌的输入流关闭
    in = null;
    buf = null;//缓冲区释放
}



该类的推回操作蛮有意思的,以前并没有使用过该类,对该操作不是很熟悉。不过该操作相当于对流数据进行了分隔,对输出的数据进行了分离和加工。同时需要注意该类的缓冲区储存的并不是从流中读取出的数据,而是推回的数据,所以缓冲区的设置应该大于你想推回的最大数据值(尽量不要使用默认构造函数,请自己指定缓冲区大小)。

tsmc12: m0po max length问题(H384.M0_PO.L.1) 手动调整可以挪cell,制造上下两个row相对的至少一个site的空间,通过插普通filler来解决,这里需要注意的是,tsmc12有via0的规则,需要让via0落在via0 grid上。在pt eco之后会有一些m0po max length问题出现,大部分问题都可以通过替换decap来解决,少部分由于局部density过高,需要手动调整。更多学习内容请关注「拾陆楼」知识星球。#ICC2中替换decap的参考脚本。 阅读详情

相关推荐

模电专题-MOS管的放大电路分析

在实际应用中,我们经常会使用到功率MOS,这时通常不会将它当成一个开关使用,而是当成一个放大器来使用,那这就需要让其工作在放大状态。参考下图中的mos管的特性曲线,右图中的输出特性曲线中有一根红色的分界线,这个线就是区分mos管工作状态的分界线,在红线的左边,mos管工作在可变电阻区,也就是线性区;在红线的右边mos管工作在恒流区,也就是饱和区。当然,还有一个截止区。本文分析主要运用模电课本中的理论计算验证。

Anitawen的博客 2万+

PushBackInputStream

pos 代表 缓存数组中下一个要读取的字节数据的位置,这里要注意一点,可以根据构造方法中pos=size的赋值来看,该下标是从大到小执行的。根据buf中已经存储的数值,返回interger的最大值或者父类in的available+buf中已经存储的数值.首先校验in的合法性,然后优先读取缓存中的数据,否则就直接调用in的read方法。内部定义了一个byte数组,就是push back 的缓冲池,大小可通过参数构建,默认为1.当然还可以一次回推多个字节,指定回推数组,从off开始len个字节。

赵航的博客 1516

BugkuCTF-PWN题pwn2-overflow超详细讲解

解题思路 1)计算出get_shell_的地址偏移量 2)算出来之后就直接溢出到后门函数 知识点 x64函数调用规则 解题之前我们先学下linux x64的函数调用规则。 x64机器在调用某个函数前,比如int func(int a, int b, int c, int d, int e, int f, int g, int h),首先他会把前6个参数从左往右存入到寄存器rdi、rsi、rdx、rcx、r8、r9,其余参数存入到栈里,保存的顺序是从右往左入栈。比如abcdef会存入到寄存器里,然后一次入栈h

am_03的博客 3014

(每日持续更新)jdk api之PushbackInputStream基础、应用、实战

返回可以从此输入流中读取(或跳过)的估计字节数,而不会受到下一次调用方法read的阻塞。:关闭此输入流并释放与该流关联的所有系统资源。:测试此输入流是否支持mark和reset方法。int read():从输入流中读取下一个数据字节。:将输入流中最多len个字节读入字节数组b中,从偏移量off开始存储数据。:将指定字节数组中的所有字节推回此输入流。:将指定字节数组中的len个字节推回此输入流。:将指定的字节推回此输入流。

a89879193的专栏 1273

ks-快手滑块验证码-Js逆向

本文分析了快手滑块验证码的破解过程。首先通过抓包找到验证码背景图接口,发现需要动态获取captchaSession参数。然后深入分析验证流程,发现verifyParam参数被加密处理,需要追踪其生成逻辑。文章详细解析了加密参数c的构成,包括captchaSn、滑动距离、轨迹信息等,并指出轨迹验证较为严格。最后通过对比浏览器和本地生成的加密值,确认加密逻辑正确,但指出轨迹生成仍需优化。作者建议参考相关文章深入分析轨迹逻辑,并提供了验证成功的截图作为参考。

2302_76420666的博客 1879

grpc安装与简单demo测试

grpc安装: 由于工作需要,最近在学google的rpc开源框架;由于本人菜鸟一枚,而且是从Windows开发转到Linux;由于之前版本控制使用的是svn,没有使用过git,所以从GitHub上下载代码是通过浏览器下载zip格式的压缩文件,折腾了好几天了,发现了各种坑,各种缺少库,各种不知道怎么把这个库给装机器上。对于一个不熟悉Linux的人来说,这个体验简直糟糕透了。没办法了又在机器上装了...

old__captain的博客 4834

java inputstream 回退_系统学习 Java IO (十)----回退流 PushbackInputStream

PushbackInputStream 旨在从 InputStream 解析数据时使用。 有时您需要先读取几个字节以查看将要发生的事情,然后才能确定如何解释当前字节, PushbackInputStream 允许这样做。 实际上,它允许将读取的字节推回到流中,这样就像流没有被动过,下次调用 read() 时,将再次重新读取。通俗来讲,就像男人对女人(Stream)说:我只看看,不动手。构造器Pus...

weixin_30864831的博客 377

JAVA基础—PushbackInputStream类简单介绍

缓存的新应用之一就是回推(pushback)的实现。回推用于输入流,以允许读取字节,然后再将它们返回(回推)到流中。PushbackInputStream类实现了这一思想,提供了一种机制,可以“偷窥”来自输入流的内容而不对它们进行破坏。 PushbackInputStream类具有以下构造函数: PushbackInputStream(InputStream inputStream) Push

此博客已停用,博文会逐渐转移到新地址,http://blog.youkuaiyun.com/liupeifeng3514 5607

“华为杯”研究生数学建模竞赛2019年-【华为杯】D题:汽车行驶工况构建(附获奖论文和MATLAB代码实现)

映了汽车道路行驶的运动学特征。准差、加速度标准差这九个特征参数用于后续的数据分析,建立了合理的汽车运动特征评。特征参数与所属类特征参数的特征值的相关性大小替代误差进行排序的,计算得到汽车行。对于问题一,我们首先对原始数据进行了时间变量转换,将原本的年月日时分秒的计。紧接着进行了运动学片段的划分,引入九个特征参数,通过主成分分析、本文研究的是汽车行驶工况构建,汽车行驶工况是描述汽车行驶的速度。的合理性评价标准,对两种方法都进行了合理性评价,得到的。进行了合理性评价,得到了最优的汽车行驶工况曲线。

getusushu的博客 1004

AutoSAR系列讲解(深入篇)14.7-Mcal Adc配置(上)

详细讲解了ADC的各个配置项的作用

雪云飞星的博客 1万+

PushbackInputStream

1. java.io.PushbackInputStream拥有一个PushBack缓冲区,从PushbackInputStream读出数据后,只要PushBack缓冲区没有满,就可以使用unread()将数据推回流的前端。 2. 假设一个文本文件中同时存储有ASCII码范围的英文字符与BIG5范围的中文字符。想要判断那些位置是ASCII而哪些位置是BIG5中文字符,BIG5中文字符使用...

车前猛跑 242

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

回滚流(回退流)——PushbackInputStream

回滚流——PushbackInputStream,可以将数据重新推入流中,然后再重新读出。很多人说这个类是为了将不需要的数据重新推入流中,我个人觉得,这样解释并不合理,不需要的数据之间丢掉不就好了嘛!干嘛还要压回去! 个人认为,回滚流主要用于在读取数据时,不确定自己需要读取多少数据时来使用。比如我之前的博客,(H.264视频码流解析)在解析h264文件时确定NAL的位置,NAL 的位置不确定,长...

淡淡的心 2302

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java 学习笔记 - IO篇:可推回流 PushbackInputStream

缓冲区1byteunread缓冲区虽然叫推回但并没有限制只能先read再unread。

灵台方寸山斜月三星洞 890

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

PushbackInputStream(推回输入流) 示例

/*缓冲的一个新颖的用法是实现推回(pushback)。Pushback用于输入流允许字节被读取然后返回(即“推回”)到流。PushbackInputStream类实现了这个想法。它提供了一种机制来“窥视”在没有受到破坏的情况下输入流生成了什么。PushbackInputStream有两个构造函数:PushbackInputStream(InputStream inputStream)

陈华江(HuaChiang Chen) 陈泉冰专栏 5722

Java IO操作——回退流PushbackInputStream

学习目标: 掌握回退流的工作原理 使用PushbackInputStream完成回退操作 回退:给了用户第二次读的机会。 回退流 在JAVA IO中所有的数据都是采用顺序的读取方式,即对于一个输入流来讲都是采用从头到尾的顺序读取的,如果在输入流中某个不需要的内容被读取进来,则只能通过程序将这些不需要的内容处理掉,为了解决这样的处理问题,在JAVA中提供了一种回退输入流(PushbackInput...

iteye_18817的博客 655

java 回退流

1 import java.io.ByteArrayInputStream; 2 import java.io.IOException; 3 import java.io.PushbackInputStream; 4 5 6 public class PushInputStreamDemo { 7 public static void main(String[] args) th...

weixin_30256505的博客 193

IO(2)

继续前面一节的IO流,这里先介绍一个PushbackInputStream类,这个类也是刚刚学习的。 先看一下官方文档,这个类基本的功能就是能读取一个一个字节,然后判断是否是我们想要的,如果不想要的话可以重新把它送回缓冲区。 public int read()throws IOException 从此输入流中读取下一个数据字节。以 int 形式返回 0 到 255 范围内字节值。如果因为已经

jj_chen_lian的专栏 1100

PushbackInputStream, 用法

package cn.itcast.net.client; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.InputStream; import java.io.OutputStream; import java.io.PushbackInputStream; import java.io.Ra

lili518的博客 955

PushbackInputStream的好处

我们知道一般的InputStream只能读取一次,顺序的,PushbackInputStream内部通过一个缓冲数组和位置指针可以实现读取之后通过一个方法(unread)将数据退回去,方便地实现读取一个流的前面一些数据做某些处理,比如判断文件头。达到男人对女人说的:我只看看,我不碰你。类似的还有PushbackReader。 ...

熊诗言的博客 659

回推流PushBackInputStream的使用和输入输出流操作

import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.PushbackInputStream; public class PushBack { /** * @throws IOException * @Title: main * @Description: TODO(描述这个方法的作用) * 会推流的使用案例,将回退的字符推到指定的位置,并

背包客—的博客 978

PushbackInputStream和StreamTokenizer的源码分析和使用方法详细分析

组的头部;②、当后续调用read()函数时优先读取这个byte[] buf字节数组中被压入的字节;当使用PushbackInputStream进行语法解析时,需要注意 unread()函数的调用顺序、EOF 处理及嵌套回退风险等。因为语法解析器常需要先预读一个字符判断类型,如果发现不是目标类型再退回去,而 InputStream.class 本身不支持回退,所以PushbackInputStream.class就是为此设计的。

Ga5CS5VvN的博客 203

pushbackInputstream

public static void main(String[] args) throws Exception {  String s = "123456789";  byte b[] = s.getBytes();  BufferedInputStream bis = new BufferedInputStream(    new ByteArrayInputStream(b));  Pus

mzh_1984的专栏 338
上一篇: Java 日看一类(47)之IO包中的PrintWriter
下一篇: Java 日看一类(49)之IO包中的PushbackReader
wyf95278
博客等级 码龄10年 38粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值