千家信息网

linux系统中InputStream输入流的reset()和mark()命令的用法

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章主要介绍"linux系统中InputStream输入流的reset()和mark()命令的用法",在日常操作中,相信很多人在linux系统中InputStream输入流的reset()和mar
千家信息网最后更新 2025年02月01日linux系统中InputStream输入流的reset()和mark()命令的用法

这篇文章主要介绍"linux系统中InputStream输入流的reset()和mark()命令的用法",在日常操作中,相信很多人在linux系统中InputStream输入流的reset()和mark()命令的用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"linux系统中InputStream输入流的reset()和mark()命令的用法"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

  今天写一个读写程序,运用到InputStream的reset方法是发现竟然失败了,然后查了一下JDK源码,发现BufferInputStream重写了父类FilterInputStream的mark和resetf方法,其有支持 mark 和 reset 方法的能力。而FileInputStream则没有重写父类InputStream的这两个方法,其不具有mark和reset方法的能力。

  在JDK源码中,写到public synchronized void mark(int readlimit)在该输入流中标记当前位置。 后续调用 reset 方法重新将流定位于最后标记位置,以便后续读取能重新读取相同字节。

  readlimit 参数给出当前输入流在标记位置变为非法前允许读取的字节数。

  这句话的意思是说:mark就像书签一样,用于标记,以后再调用reset时就可以再回到这个mark过的地方。mark方法有个参数,通过这个整型参数,你告诉系统,希望在读出这么多个字符之前,这个mark保持有效。比如说mark(10),那么在read()10个以内的字符时,reset()操作后可以重新读取已经读出的数据,如果已经读取的数据超过10个,那reset()操作后,就不能正确读取以前的数据了,因为此时mark标记已经失效。

  下面是BufferInputStream以及父类FilterInputStream 中这两个方法的默认实现//FilterInputStream.java

  public synchronized void mark(int readlimit) {in.mark(readlimit);

  }

  public synchronized void reset() throws IOException {in.reset();

  }

  
public boolean markSupported() {
return in.markSupported()
}

  //BufferedInputStream.java

  public synchronized void mark(int readlimit) {marklimit = readlimit;

  markpos = pos;

  }

  public synchronized void reset() throws IOException {getBufIfOpen(); // Cause exception if closedif (markpos < 0)

  throw new IOException("Resetting to invalid mark");pos = markpos;

  }

  public boolean markSupported() {

  return true;

  } //支持mark操作

  而FileInputStream没有重写父类InputStream的默认实现,其默认实现如下:

  //InputStream.java

  public synchronized void mark(int readlimit) {}//空实现什么都没有实现public synchronized void reset() throws IOException {throw new IOException("mark/reset not supported");}//不支持reset操作

  public boolean markSupported() {

  return false;

  } //不支持mark操作

  下面是一个简单的程序,用于设置reset和mark.

  import java.io.BufferedInputStream;

  import java.io.File;

  import java.io.FileInputStream;

  import java.io.IOException;

  import java.io.InputStream;

  public class TestInputStream {

  public void read(InputStream in) throws IOException {if(in == null) {

  return;

  }

  int len=0;

  in.mark(1);

  in.read() //第一次读取

  in.reset();//又可以重新读取

  in.read()//第二次读取跟第一次读取结果一样。因为只读了一个,没有超过mark设置的整数。所以mark有效}

  public static void main(String[] args) throws IOException {TestInputStream test = new TestInputStream();String fileName = "F:/Google.txt";

  InputStream in1 = new FileInputStream(new File(fileName));if(!in1.markSupported()) {

  in1 = new BufferedInputStream(in1);

  }

  test.read(in1);

  byte[] buf = new byte[100];

  while(in1.read(buf, 0, buf.length)!=-1) {System.out.println(buf);

  }

  System.out.println("Success!");

  }

  }

  总结:

  mark

  public void mark(int readlimit)

  mark 的常规协定是:如果方法 markSupported 返回 true,那么输入流总是在调用 mark 之后记录所有读取的字节,并时刻准备在调用方法 reset 时(无论何时),再次提供这些相同的字节。但是,如果在调用 reset 之前可以从流中读取多于 readlimit 的字节,则不需要该流记录任何数据。

  参数:

  readlimit - 在标记位置失效前可以读取字节的最大限制。

  4 reset

  public void reset() throws IOException

  将此流重新定位到最后一次对此输入流调用 mark 方法时的位置。

  reset 的常规协定是:

  1、如果方法 markSupported 返回 true,那么:

  如果创建流以后未调用方法 mark,或最后调用 mark 以后从该流读取的字节数大于最后调用 mark 时的参数,则可能抛出 IOException。

  如果未抛出这样的 IOException,则将该流重新设置为这种状态:最近一次调用 mark 以后(如果未调用过 mark,则从文件开头开始)读取的所有字节将重新提供给 read 方法的后续调用者,后跟任何从调用 reset 时起将作为下一输入数据的字节。

  2、如果方法 markSupported 返回 false,那么:

  对 reset 的调用可能抛出 IOException。

  如果未抛出 IOException,则将该流重新设置为一种固定状态,该状态取决于输入流的特定类型及其创建方式。提供给 read 方法后续调用者的字节取决于特定类型的输入流。

  除了抛出 IOException 之外,类 InputStream 的方法 reset 不执行任何操作。

  抛出:

  IOException - 如果未标记此流或该标记失效。

到此,关于"linux系统中InputStream输入流的reset()和mark()命令的用法"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

方法 输入 字节 标记 系统 位置 参数 数据 命令 学习 支持 状态 有效 相同 两个 协定 取决于 字符 常规 更多 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 宜昌贝库互联网科技有限公司座机 银行网络安全转培训总结 默认无线网络安全吗 手机突然显示正在连接服务器 软件开发文档设计范例 fifa22球员数据库工具 网络安全方案排版图片 软件开发v模型怎么样 网络安全优秀教师奖获奖名单 电子商务数据库技术 论述题 服务器安全防御教程 软件开发要做等保测评 爆笑姐妹是用什么软件开发的 广东安卓软件开发哪家可靠 徐汇区个人数据库研发厂家报价 国家网络安全知识竞赛网站 美团数据库问题 mysql数据库联网 软件开发自学需要多久 一线城市软件开发成本 关于宣传网络安全的手抄报 调用数据库的命令 java上传图片到服务器 汇付网络技术有限公司工资 软件开发后需要怎么登记 武汉大学网络安全学硕复试 叶凯是大掌门游戏软件开发人吗 张家港营销网络技术服务价格 网站需要一个服务器吗 网上银行网络安全管理办法
0