A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄敏文 黑马帝   /  2011-9-1 17:57  /  2128 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

流中的mark()方法有什么应用,如何使流支持mark操作呢

3 个回复

倒序浏览
首先,在介绍mark()方法的应用之前
我们还是先来简单介绍一下mark()这个方法的作用吧:

mark()方法,是InputStream中提供的一个方法
由于InputStream的作用就是用来读取数据的
所以为了方便理解,在这里你就可以把读取数据的过程想象成读书的过程
当你调用mark()方法时,你就相当于往你正在读的这一页夹入了一个书签
这样,如果你以后想要从这一页重新读的话,你就只需要翻回到书签所在的位置就可以了

所以,mark()这个方法的作用是:
在InputStream读取数据的时候
你只要调用mark()方法,就可以在当前正在读取的位置建立一个标记
这样,不管这个InputStream又向后继续读取到了哪里
都可以很方便地让InputStream回到标记的位置,并从这个位置开始重新读取后面的数据
而让InputStream回到标记的位置的方法,叫做reset()方法,这个方法也是由InputStream提供的

好了,既然了解了mark()方法的作用,那么它的应用也就比较明朗了吧
比如说,当你读取一个文件的时候,如果你想要把文件中的一部分重复读取多遍
你就可以在想要重复读取的起点调用mark()方法,并且在想要重复读取的终点调用reset()方法就可以了
当然,这只是一个例子而已,具体的应用,还是需要靠你在工作和生活中去遇到~

但是,就像你的疑问那样,并不是所有的InputStream类都是支持mark()和reset()操作的
比如说,用来从文件中读取数据的FileInputStream,就是一个典型的不支持mark()和reset()操作的类
那么,如果你想要重复读取一个文件中的一段内容的话,应当怎么办呢?
呵呵,在这里我就不说具体答案了
我只提示一点,BufferedInputStream是支持mark()和reset()操作的~

Tips:关于BufferedInputStream的作用,我想你应该已经学过了吧呵呵~
如果还没有学到的话,在张孝祥老师的视频课程中IO部分的《JAVA高级02_11》一节就有详细的讲解
其实知识这种东西,通过自己的努力和思考去弄懂的话,印象会比直接得到答案要深很多很多呢~

[ 本帖最后由 李叶 于 2011-09-01  20:33 编辑 ]

评分

参与人数 1技术分 +2 收起 理由
wangfayin + 2 回答的很好!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-9-1 20:36:56
藤椅

回复 沙发 的帖子

比喻通俗易懂,印象深刻,表达连贯流畅,思路清晰
回复 使用道具 举报
黑马网友  发表于 2011-9-1 22:42:57
板凳
JDK中详细解释。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马