InputStream 中 Mark方法中的参数到底有什么作用

yaya_07 2010-10-31 04:26:26
我写了一段代码,里面有Mark()方法,其中的参数不起作用这是为什么啊??


import java.io.*;

public class TestBufferedInputStream{
public static void main(String args[]){
try{
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("TestBufferedInputStream.java"));
int c = 0;
bis.read();
bis.read();
bis.mark(100);
for(int i = 0;i<110&&(c = bis.read()) != -1;i++){
System.out.print((char)c);
}

System.out.println();
bis.reset();
for(int i = 0;i<10&&(c = bis.read()) != -1;i++){
System.out.print((char)c);
}

bis.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
...全文
422 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
一夜相思愁 2010-11-06
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 redduke1202 的回复:]
对于 FileInputStream.无mark实现,即继承了InputStream的缺省实现。不支持mark,自然mark方法里的参数也无关痛痒
[/Quote]

谢谢,受教了
whlyj20030719 2010-11-04
  • 打赏
  • 举报
回复
学习了,楼上研究的很透彻,顶
「已注销」 2010-11-04
  • 打赏
  • 举报
回复
对于 FileInputStream.无mark实现,即继承了InputStream的缺省实现。不支持mark,自然mark方法里的参数也无关痛痒
whlyj20030719 2010-11-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 whlyj20030719 的回复:]
印象中好像在哪个贴子上说mark方法对FileInputStream不起作用,求签定...
[/Quote]

签定失败


public class TestBufferedInputStream {
public static void main(String args[]) {
try {
int c = 0;
byte [] bytes = new byte[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
BufferedInputStream bis = new BufferedInputStream(bais);
bis.read();
bis.mark(3);
for(int i = 0;i<6&&(c = bis.read()) != -1;i++){
System.out.print(c);
}
System.out.println();
bis.reset();
for(int i = 0;i<6&&(c = bis.read()) != -1;i++){
System.out.print(c);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}


结果:
234567
234567
「已注销」 2010-11-04
  • 打赏
  • 举报
回复
具体看源码里是否实现了 mark 方法及具体实现细节

1.ByteArrayInputStream

public void mark(int readAheadLimit) {
mark = pos;
}

mark与方法参数无关。只要你mark了,就可以reset.而不管你往后读取了多少个.

2.BufferedInputStream

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

看代码,似乎是和readlimit参数有关。但是仔细查看相关代码,可知,BufferedInputStream默认开8k的缓冲区,如果你在开始就mark,那么理论上最长可以read 8k数据,还可以成功reset回来。

InputStream方法里关于mark的文档,仅仅是一个最低实现要求。也就是说,如果支持mark,那么当你读取不超过readlimit个字节时,reset必须还原至mark的点。但是如果你有能力缓冲更多,则没有要求,也就是说,并没有强制要求读取超过readlimit时必须失效
「已注销」 2010-11-04
  • 打赏
  • 举报
回复
这个要看具体实现的,比如
你用 ByteArrayInputStream 做输入流,那么只要你mark了,哪怕你只mark了1,你读取几M都可以reset回来(如果你的原始ByteArrayInputStream里确实有这么多内容的话)
whlyj20030719 2010-11-04
  • 打赏
  • 举报
回复
印象中好像在哪个贴子上说mark方法对FileInputStream不起作用,求签定...
yaya_07 2010-11-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 visket2008 的回复:]
你先定义了那个缓冲字节流 bis ,然后就要读取bis 里的东西了吧?
然后你定义了一个mark,这个mark在Api上的意思说的是:在此输入流中标记当前的位置。

说通俗一点吧,就是对BufferedInputStream bis 进行了标记,记录它在接下来从第100个字节开始读取。
那个后面的reset()方法,就是让读取的数据重新回到mark的那第100个字节的位置,重新往后读取。……
[/Quote]

不是的我是想看看mark方法的效果和当读取范围超过限制时mark失效,可是当超出范围后依然能够reset到原标记位
yaya_07 2010-11-04
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 goldenfish1919 的回复:]
for(int i = 0;i<110&&(c = bis.read()) != -1;i++){
貌似是:
for(int i = 0;i<10&&(c = bis.read()) != -1;i++){
这一句表示:
bis.mark(100);
极限是100个字符以内有效,110就超出范围了
[/Quote]

我就是想让它失效,然后表示超出范围,然后回不到标记位,可是结果是依然能回到标记位
lijiemissfei 2010-11-01
  • 打赏
  • 举报
回复
看看源码你就知道它是干嘛的了 (int marklimit)
/**
* The maximum read ahead allowed after a call to the
* <code>mark</code> method before subsequent calls to the
* <code>reset</code> method fail.
* Whenever the difference between <code>pos</code>
* and <code>markpos</code> exceeds <code>marklimit</code>,
* then the mark may be dropped by setting
* <code>markpos</code> to <code>-1</code>.
*
* @see java.io.BufferedInputStream#mark(int)
* @see java.io.BufferedInputStream#reset()
*/
protected int marklimit;
caofaping 2010-11-01
  • 打赏
  • 举报
回复
貌似没发现有什么鸟用
一夜相思愁 2010-11-01
  • 打赏
  • 举报
回复
你先定义了那个缓冲字节流 bis ,然后就要读取bis 里的东西了吧?
然后你定义了一个mark,这个mark在Api上的意思说的是:在此输入流中标记当前的位置。

说通俗一点吧,就是对BufferedInputStream bis 进行了标记,记录它在接下来从第100个字节开始读取。
那个后面的reset()方法,就是让读取的数据重新回到mark的那第100个字节的位置,重新往后读取。
若鱼1919 2010-10-31
  • 打赏
  • 举报
回复
for(int i = 0;i<110&&(c = bis.read()) != -1;i++){
貌似是:
for(int i = 0;i<10&&(c = bis.read()) != -1;i++){
这一句表示:
bis.mark(100);
极限是100个字符以内有效,110就超出范围了

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧