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就会异常