知识大全 JAVA中mark()和reset()用法

Posted 字节

篇首语:宁可身骨苦,不叫面皮羞。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 JAVA中mark()和reset()用法相关的知识,希望对你有一定的参考价值。

JAVA中mark()和reset()用法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  <p>根据JAVA官方文档的描述 mark(int readlimit)方法表示 标记当前位置 并保证在mark以后最多可以读取readlimit字节<span class= t_tag tag php?name=%CA%FD%BE%DD >数据</span> mark标记仍有效 如果在mark后读取超过readlimit字节数据 mark标记就会失效 调用reset()方法会有异常

  但实际的运行情况却和JAVA文档中的描述并不完全相符 有时候在BufferedInputStream类中调用mark(int readlimit)方法后 即使读取超过readlimit字节的数据 mark标记仍有效 仍然能正确调用reset方法重置 </p><p>事实上 mark在JAVA中的实现是和缓冲区相关的 只要缓冲区够大 mark后读取的数据没有超出缓冲区的大小 mark标记就不会失效 如果不够大 mark后又读取了大量的数据 导致缓冲区更新 原来标记的位置自然找不到了 </p><p>因此 mark后读取多少字节才失效 并不完全由readlimit参数确定 也和BufferedInputStream类的缓冲区大小有关(默认情况下缓冲区大小为 ) 如果BufferedInputStream类的缓冲区大小大于readlimit 在mark以后只有读取超过缓冲区大小的数据 mark标记才会失效 看下面的例子 </p> view plain

  view plain

  view plain package packet

  import java io BufferedInputStream

  import java io ByteArrayInputStream

  import java io IOException

  /**

  * @author WuDian

  *

  */

  public class MarkExample

  public static void main(String[] args)

  try

  // 初始化一个字节数组 内有 个字节的数据

  byte[] bytes=

  // 用一个ByteArrayInputStream来读取这个字节数组

  ByteArrayInputStream in=new ByteArrayInputStream(bytes)

  // 将ByteArrayInputStream包含在一个BufferedInputStream 并初始化缓冲区大小为

  BufferedInputStream bis=new BufferedInputStream(in )

  // 读取字节

  System out print(bis read()+ )

  // 在字节 处做标记 同时设置readlimit参数为

  // 根据JAVA文档mark以后最多只能读取 个字节 否则mark标记失效 但实际运行结果不是这样

  System out println( mark )

  bis mark( )

  /*

  * 连续读取两个字节 超过了readlimit的大小 mark标记仍有效

  */

  // 连续读取两个字节

  System out print(bis read()+ )

  System out print(bis read()+ )

  // 调用reset方法 未发生异常 说明mark标记仍有效

  // 因为 虽然readlimit参数为 但是这个BufferedInputStream类的缓冲区大小为

  // 所以允许读取 字节

  System out println( reset )

  bis reset()

  /*

  * 连续读取 个字节 超过了缓冲区大小 mark标记失效

  * 在这个例子中BufferedInputStream类的缓冲区大小大于readlimit

  * mark标记由缓冲区大小决定

  */

  // reset重置后连续读取 个字节 超过了BufferedInputStream类的缓冲区大小

  System out print(bis read()+ )

  System out print(bis read()+ )

  System out print(bis read()+ )

  // 再次调用reset重置 抛出异常 说明mark后读取 个字节 mark标记失效

  System out println( reset again )

  bis reset()

   catch (IOException e)

  // TODO Auto generated catch block

  e printStackTrace()

  

  

  

  运行结果如下

   mark reset reset again java io IOException Resetting to invalid mark at java io BufferedInputStream reset(BufferedInputStream java )

  at packet MarkExample main(MarkExample java )       同样的 在调用mark(int readlimit)方法时 如果readlimit大于BufferedInputStream类缓冲区的大小 缓冲区会被扩大 那mark后最多就可以读readlimit字节

  简言之 BufferedInputStream类调用mark(int readlimit)方法后读取多少字节标记才失效 是取readlimit和BufferedInputStream类的缓冲区大小两者中的最大值 而并非完全由readlimit确定 这个在JAVA文档中是没有提到的

  JAVA中mark()和reset()用法的通俗理解

  mark就像书签一样 在这个BufferedReader对应的buffer里作个标记 以后再调用reset时就可以再回到这个mark过的地方 mark方法有个参数 通过这个整型参数 你告诉系统 希望在读出这么多个字符之前 这个mark保持有效 读过这么多字符之后 系统可以使mark不再有效 而你不能觉得奇怪或怪罪它 这跟buffer有关 如果你需要很长的距离 那么系统就必须分配很大的buffer来保持你的mark //eg //reader      is      a      BufferedReader

  reader mark( ) //要求在 个字符之内 这个mark应该保持有效 系统会保证buffer至少可以存储 个字符int      a      =      reader read() //读了一个字符int      b      =      reader read() //又读了一个字符

cha138/Article/program/Java/hx/201311/26119

相关参考

知识大全 Java中7关于#的用法

Java中7关于#的用法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  你认识“#”么?让我猜猜

知识大全 Java中static用法简谈

Java中static用法简谈  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  请先看下面这段程序

知识大全 Java中set的简单用法

Java中set的简单用法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Set的最大特点是能去

知识大全 Java语言中Timer类的简洁用法(二)

Java语言中Timer类的简洁用法(二)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  实现计

知识大全 Java语言中Timer类的简洁用法(一)

Java语言中Timer类的简洁用法(一)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  所有类

知识大全 Java中Static、this、super、final用法

Java中Static、this、super、final用法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看

知识大全 java多线程中synchronized关键字的用法

  由于同一进程内的多个线程共享内存空间在Java中就是共享实例当多个线程试图同时修改某个实例的内容时就会造成冲突因此线程必须实现共享互斥使多线程同步  最简单的同步是将一个方法标记为synchron

知识大全 无线路由器按了reset后为什么收不到信号了?

无线路由器按了reset后为什么收不到信号了?你按了reset之后无线路由器就恢复出厂设置了,你在无线路由器设置的上网账号及密码都没了,当然就没信号了,你得重新对无线路由器进行设置。那是复位键,长按可

知识大全 Java中集合容器类List和Set的用法

Java中集合容器类List和Set的用法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  容器类

知识大全 java的hashtable的用法

  在main()中每次产生一个随机数字它都会封装到一个Integer对象里使句柄能够随同散列表一起使用(不可对一个集合使用基本数据类型只能使用对象句柄)containKey()方法检查这个键是否已经