BufferedInputStream类中的mark(int readlimit)方法

对于BufferedInputStream类中的mark(int readlimit)方法的使用,很多人的疑惑是:参数readlimit究竟起什么作用?
好象给readlimit赋任何整数值结果都是一样。

 1 package io;
 2 
 3 import java.io.*;
 4 
 5 public class BufInputStrm_A {
 6 
 7     public static void main(String[] args) throws IOException {
 8         String s = "ABCDEFGHI@JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
 9         byte[] buf = s.getBytes();
10         ByteArrayInputStream in = new ByteArrayInputStream(buf);
11         BufferedInputStream bis = new BufferedInputStream(in, 13);
12         int i = 0;
13         int k;
14         do {
15             k = bis.read();
16             System.out.print((char) k + " ");
17             i++;
18 
19             if (i == 4) {
20                 bis.mark(8);
21             }
22         } while (k != '@');
23 
24         System.out.println();
25         
26         bis.reset();
27         k = bis.read();
28         while (k != -1) {
29 
30             System.out.print((char) k + " ");
31             k = bis.read();
32         }
33 
34     }
35 }
36 

备注:为了方便说明问题,我们假设要读取的是一个字符串(第8行代码),同时把缓存的大小设置为了13(第11行代码)。
在第20行代码处调用了mark(int readlimit)方法,但无论给该方法传-1、0、13、100程序输出的结果都是一样:

A B C D E F G H I @ 
E F G H I @ J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 

在官方的API帮助文档中,对于readlimit这个参数的解释是:
    readlimit - the maximum limit of bytes that can be read before the mark position becomes invalid.
其实,这里的最大字节数(the maximum limit of bytes)是指调用reset()方法之后,读取超过readlimit指定的字节数,标记维(the mark position)会失效,如果这时再次调用reset()方法,会出现Resetting to invalid mark异常。例如下面的程序:

 1 package io;
 2 
 3 import java.io.*;
 4 
 5 public class BufInputStrm_A {
 6 
 7     public static void main(String[] args) throws IOException {
 8         String s = "ABCDEFGHI@JKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
 9         byte[] buf = s.getBytes();
10         ByteArrayInputStream in = new ByteArrayInputStream(buf);
11         BufferedInputStream bis = new BufferedInputStream(in, 13);
12         int i = 0;
13         int k;
14         do {
15             k = bis.read();
16             System.out.print((char) k + " ");
17             i++;
18 
19             if (i == 4) {
20                 bis.mark(8);
21             }
22         } while (k != '@');
23 
24         System.out.println();
25 
26         bis.reset();
27         k = bis.read();
28         while (k != -1) {
29 
30             System.out.print((char) k + " ");
31             k = bis.read();
32         }
33 
34         System.out.println();
35 
36         bis.reset();
37         k = bis.read();
38         while (k != -1) {
39             System.out.print((char) k + " ");
40             k = bis.read();
41 
42         }
43 
44     }
45 }
46 

如果我们在第一次调用了reset()方法之后,控制读入的字节不超过8个,程序就会正常执行,例如我们对上面的程序的26-32代码用下面的代码替换,程序就可以正常运行了。

        bis.reset();
        
int j = 1;
        k 
= bis.read();
        
while (j < 9) {
            
            System.out.print((
char) k + " ");
            k 
= bis.read();
            j
++;
        }

补充:
    在mark(int readlimit)方法的代码中,readlimit的值会赋给数据域marklimit,如果marklimit的值大于缓冲区的值BufferedInputStream会对缓冲区的大小进行调整,调整为marklimit的值。

 



----------------------------------
把人做到宽容,把技术做到强悍。

posted on 2008-04-24 14:45 OldBoy 阅读(1427) 评论(5)  编辑  收藏 所属分类: Java基础

评论

# re: BufferedInputStream类中的mark(int readlimit)方法 2009-06-19 13:01 cloris

谢谢分享,尤其是对于处在“较盲”阶段的人,很受用。  回复  更多评论   

# re: BufferedInputStream类中的mark(int readlimit)方法 2009-08-08 11:19 本娃娃

import java.io.*;

public class TestBufferStream {
public static void main(String[] args) {
try {
FileInputStream fis = new FileInputStream("F:\\猪舍一角\\读书笔记\\heihei.java");
BufferedInputStream bis = new BufferedInputStream(fis);
int c = 0;
System.out.println(bis.read());
System.out.println(bis.read());
bis.mark(10);
for(int i=0;i<200&&(c=bis.read())!=-1;i++) {
System.out.print((char)c+"");
}
System.out.println();
bis.reset();
for(int i=0;i<200&&(c=bis.read())!=-1;i++) {
System.out.print((char)c+"");
}
bis.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}


你能帮我看看这段代码吗??还是不明白你的意思、、我自己再查查、、
谢谢了!!(mark的参数怎么变都可以、、没影响、、不明白、、)  回复  更多评论   

# re: BufferedInputStream类中的mark(int readlimit)方法 2009-12-11 18:41 mixthm

谢谢你的解释,不过似乎说mark代表最大的字节数,有些问题
如果在你的第2个代码部分中,将第一次的reset操作后,限制读取的次数,
如while(k!=-1 && i++<12),第二次reset操作,读取正常,但是如果是
while(k!=-1 && i++<13),就会出现Resetting to invalid mark异常。
我怀疑这里mark没有实际的作用,操作还是取决于缓存区的大小  回复  更多评论   

# re: BufferedInputStream类中的mark(int readlimit)方法 2009-12-11 18:51 mixthm

按照你的解释,第一次调用reset()后,如果超过readlimit设定的字节数后,就会出错,可是只要从reset的坐标位置开始,没有超过缓存大小,第二次读取依旧正常。  回复  更多评论   

# re: BufferedInputStream类中的mark(int readlimit)方法 2011-01-10 14:57 wofacha

@mixthm
mixthm的解释是正确的。mark后读多少字节失效,是取readlimit和BufferedInputStream缓冲区两者的最大值。在这个例子中,readlimit是8字节,缓冲区是13字节,因此在mark后读13个字节标记才会失效,而不是8字节后。
是从mark以后算起,不是从reset以后。  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2009年8月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

文章分类

文章档案

相册

搜索

最新评论

阅读排行榜

评论排行榜