黑马程序员技术交流社区

标题: 关于BufferedInputStream的mark和reset方法疑惑 [打印本页]

作者: 马睿    时间: 2012-9-16 14:18
标题: 关于BufferedInputStream的mark和reset方法疑惑
mark(int readlimit)
          在此输入流中标记当前的位置。
reset()
          将此流重新定位到最后一次对此输入流调用 mark 方法时的位置。

也就是说mark是标记一个光标记录点功能,而reset是回到光标记录点


然后我去查看了mark的说明
参数readlimit 参数告知此输入流在标记位置失效之前允许读取的字节数。

也就是说:如果我读取了一段字节超过了readlimit  的长度,则会让mark标记失效

然后我去看了reset的说明:
意思是超过长度会抛出个异常


然后我做了一段代码(因为昨天晚上1点临时设计的,迷迷糊糊也不想仔细命名写注释了,格式有点乱)

以下为部分关键代码:
public void read() throws Exception
{
        FileInputStream  fis_ReadStream1 = new FileInputStream("D:\\JPG\\combine.txt");
        BufferedInputStream bis_buff1 = new BufferedInputStream(fis_ReadStream1, 1000);
        int i_read = 0;
        while ( (i_read = bis_buff1.read()) != -1 )
        {

            if(i_read == 'a')
            {
                bis_buff1.mark(1);          /*此处长度为1*/
                //关键步骤,还原读取
                byte bx[] = new byte[6];    /*我读取了6个,超长*/
                bis_buff1.read(bx, 0, 6);
                bis_buff1.reset();                 /*reset没有出现异常????*/
                System.out.println(new String(bx));
                break;
            }
        }
        bos_buff.flush();

         BufferedInputStream.close()
        fis_ReadStream1 .close();

}
作者: 史小兵    时间: 2012-9-16 14:53
import java.io.BufferedInputStream;
import java.io.InputStream;

public class MyBuffer extends BufferedInputStream {
public MyBuffer(InputStream in, int size) {
   super(in, size);
   // TODO Auto-generated constructor stub
}

public MyBuffer(InputStream in) {
   super(in);
   // TODO Auto-generated constructor stub
}

public int getMarklimit() {
   return marklimit;
}

public int getMarkPosition() {
   return markpos;
}

public int getBufferLength() {
   return buf.length;
}
}

测试类修改如下:

import java.io.*;
import java.util.regex.Pattern;

/**
* @author shizy TODO To change the template for this generated type comment go
*         to Window - Preferences - Java - Code Style - Code Templates
*/
public class Test {
static public void main(String[] p) throws Exception {
   MyBuffer bis = new MyBuffer(new FileInputStream("e:\\temp\\a.txt"));
   int available = bis.available();
   System.out.println("available:" + available);
   System.out.println("getBufferLength:" + bis.getBufferLength());
   System.out.println("getMarklimit:" + bis.getMarklimit());
   System.out.println("getMarkPosition:" + bis.getMarkPosition());
   // ---
   int markLimit = available;
   bis.mark(markLimit);
   System.out.println("---mark:" + markLimit);
   System.out.println("getBufferLength:" + bis.getBufferLength());
   System.out.println("getMarklimit:" + bis.getMarklimit());
   System.out.println("getMarkPosition:" + bis.getMarkPosition());
   byte[] temp = new byte[available];
   bis.read(temp);
   System.out.println("---read:" + available);
   System.out.println("getBufferLength:" + bis.getBufferLength());
   System.out.println("getMarklimit:" + bis.getMarklimit());
   System.out.println("getMarkPosition:" + bis.getMarkPosition());
   System.out.println("---read one byte:" + bis.read());
   System.out.println("getBufferLength:" + bis.getBufferLength());
   System.out.println("getMarklimit:" + bis.getMarklimit());
   System.out.println("getMarkPosition:" + bis.getMarkPosition());
   bis.reset();
   System.out.println("reset ok!");
   bis.close();
}
}

上边是测试代码:
运行结果如下:
available:8384
getBufferLength:8192
getMarklimit:0
getMarkPosition:-1
---mark:8384
getBufferLength:8192
getMarklimit:8384
getMarkPosition:0
---read:8384
getBufferLength:8384
getMarklimit:8384
getMarkPosition:0
---read one byte:-1
getBufferLength:8384
getMarklimit:8384
getMarkPosition:-1
Exception in thread "main" java.io.IOException: Resetting to invalid mark
at java.io.BufferedInputStream.reset(Unknown Source)
at com.Test.main(Test.java:41)
这是运行结果:
可见,在输出了“---read:8384”后,BufferLength变成了与Marklimit一样的大小,因此就不会出现异常!
至于异常是因为当BufferLength刚好与从输入流读入的数据相等时(缓冲区会随着marklimit大小增长),如果再读入数据,即时此时未读入数据,则也会认为超过了Marklimit限制,则reset会抛出异常。

作者: 马睿    时间: 2012-9-16 15:02
原来如此……Marklimit会随着缓冲池BufferLength的大小而一起变大…超过BufferLength就会异常

感谢楼上解答




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2