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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马睿 中级黑马   /  2012-9-16 14:18  /  2704 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

mark(int readlimit)
          在此输入流中标记当前的位置。
reset()
          将此流重新定位到最后一次对此输入流调用 mark 方法时的位置。

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


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

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

然后我去看了reset的说明:
  • 如果创建流以后未调用方法 mark,或最后调用 mark 以后从该流读取的字节数大于最后调用 mark 时的参数(也就是超过长度mark失效),则可能抛出 IOException。
意思是超过长度会抛出个异常


然后我做了一段代码(因为昨天晚上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();

}

评分

参与人数 1技术分 +1 收起 理由
创出一片辉煌 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
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会抛出异常。

评分

参与人数 1技术分 +1 收起 理由
田建 + 1

查看全部评分

回复 使用道具 举报
原来如此……Marklimit会随着缓冲池BufferLength的大小而一起变大…超过BufferLength就会异常

感谢楼上解答
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马