`
wangxucumt
  • 浏览: 25865 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

InputStream一些细节

阅读更多
Java  InputStream  的mark 和reset操作
mark用于标记当前位置;在读取一定数量的数据(小于readlimit的数据)后使用reset可以回到mark标记的位置。
FileInputStream不支持mark/reset操作;BufferedInputStream支持此操作;

mark(readlimit)的含义是在当前位置作一个标记,制定可以重新读取的最大字节数,也就是说你如果标记后读取的字节数大于readlimit,你就再也回不到回来的位置了。

通常InputStream的read()返回-1后,说明到达文件尾,不能再读取。除非使用了mark/reset



public   void   mark(int   readlimit)在此输入流中标记当前的位置。对   reset   方法的后续调用会在最后标记的位置重新定位此流,以便后续读取重新读取相同的字节。  
readlimit   参数告知此输入流在标记位置失效之前允许读取许多字节。  

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

InputStream   的   mark   方法不执行任何操作。  



mark就像书签一样,在这个BufferedReader对应的buffer里作个标记,以后再调用reset时就可以再回到这个mark过的地方。mark方法有个参数,通过这个整型参数,你告诉系统,希望在读出这么多个字符之前,这个mark保持有效。读过这么多字符之后,系统可以使mark不再有效,而你不能觉得奇怪或怪罪它。这跟buffer有关,如果你需要很长的距离,那么系统就必须分配很大的buffer来保持你的mark。  
  //eg.  
  //reader is a BufferedReader  
   
  reader.mark(50);//要求在50个字符之内,这个mark应该保持有效,系统会保证buffer至少可以存储50个字符  
  int a = reader.read();//读了一个字符  
  int b = reader.read();//又读了一个字符  
   
  //做了某些处理,发现需要再读一次  
  reader.reset();  
  reader.read();//读到的字符和a相同  
  reader.read();//读到的字符和b相同
分享到:
评论

相关推荐

    Java JDK 7学习笔记(国内第一本Java 7,前期版本累计销量5万册)

    10.1 inputstream与outputstream 300 10.1.1 串流设计的概念 300 10.1.2 串流继承架构 303 10.1.3 串流处理装饰器 306 10.2 字符处理类 311 10.2.1 reader与writer继承架构 311 10.2.2 字符处理装饰器 ...

    HTTP请求库java-requests.zip

    Java的世界里,HttpClient 是一个功能强大的Http请求库,然而接口非常复杂,设计上遵从正交性,简单的请求也需要写比较多的代码,更不要说隐藏在各种细节里面的高级用法了。Requests, 是一个模仿python requests ...

    JAVA基础课程讲义

    封装的使用细节 76 多态(polymorphism) 76 为什么需要多态? 76 如何实现多态? 77 方法绑定(method binding) 77 静态绑定 77 动态绑定 77 多态的使用要点 78 对象的转型(casting) 79 final 81 抽象类 82 抽象类的使用...

    jsr80 java 访问 usb

    在本文中,将对 jUSB 和 JSR-80 项目作一个简要介绍,不过,我们首先要看一下 USB 协议的具体细节,这样您就可以理解这两个项目是如何与 USB 设备交互的。我们还将提供代码片段以展示如何用这两个项目的 API 访问 ...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

    一个对象(即离散的部件),而数据和操作细节(方法)隐藏起来。如果增加某些限制,使 得对数据的访问可按照统一的方式进行,那些能比较容易地产生更为强壮的代码。 OOP 语言提出一种(或称为协议),以保证对数据...

    day020-继承加强和设计模式代码和笔记.rar

    由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用, 所以 不允许直接通过引用进行操作。 2. 拓展类加载器(Extension classLoader): 扩展类加载器是...

    Java服务器程序设计

    5.1.7 类servletinputstream[/font] 5.1.8 类servletoutputstream[/font] 5.2 javax.servlet.http包[/font] 5.2.1 接口httpservletrequest[/font] 5.2.2 接口httpservletresponse[/font] 5.2.3 类httpservlet[/font]...

    java 面试题 总结

    抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性...

    超级有影响力霸气的Java面试题大全文档

    抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承:  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确...

    java经典面试2010集锦100题(不看你后悔)

    C) Java中的封装就是将对象的数据和操作数据的方法相结合,通过方法将对象的数据和实现细节保护起来。 D) Java语言中的多态的含义可以表达为:对外一个接口,内部多种实现。Java语言支持两种多态:运行时多态和编译...

Global site tag (gtag.js) - Google Analytics