这篇博客主要是测试验证上篇BufferedInputStream一些主要方法源码的解析(skip,reset,fill,read),配合上篇博客使用。测试结果就不贴了,因为会将测试源码贴出来,感兴趣的可以复制过去运行,但需要改一下文件名,用自己的文件名,我自己的测试文件包含了12492字节数,我觉得测试文件大于1500就可以运行这个源码不出问题了。
测试使用技术:使用反射拿到BufferedInputStream类count,pos,markpos,marklimit字段值。
import java.io.*;
import java.lang.reflect.*;
public class TestBuffer4{
static void getFields(BufferedInputStream bis)throws NoSuchFieldException,IllegalAccessException{
Field fieldCount=bis.getClass().getDeclaredField("count");
fieldCount.setAccessible(true);
Field fieldPos=bis.getClass().getDeclaredField("pos");
fieldPos.setAccessible(true);
Field fieldMarkpos=bis.getClass().getDeclaredField("markpos");
fieldMarkpos.setAccessible(true);
Field fieldMarklimit=bis.getClass().getDeclaredField("marklimit");
fieldMarklimit.setAccessible(true);
System.out.println("count: "+fieldCount.get(bis));
System.out.println("pos: "+fieldPos.get(bis));
System.out.println("markpos: "+fieldMarkpos.get(bis));
System.out.println("marklimit: "+fieldMarklimit.get(bis));
}
//没有使用缓存
static void testSkip1(BufferedInputStream bis)throws NoSuchFieldException,IllegalAccessException,IOException{
System.out.println("testSkip1 function:");
System.out.println("available: "+bis.available());
bis.skip(600);
getFields(bis);
System.out.println("available: "+bis.available());
System.out.println("======");
}
//使用缓存
static void testSkip2(BufferedInputStream bis)throws NoSuchFieldException,IllegalAccessException,IOException{
System.out.println("testSkip2 function");
System.out.println("available: "+bis.available());
bis.mark(10);
bis.skip(50);
getFields(bis);
System.out.println("available: "+bis.available());
System.out.println("======");
}
//使用缓存
static void testSkip3(BufferedInputStream bis)throws NoSuchFieldException,IllegalAccessException,IOException{
System.out.println("testSkip3 function");
System.out.println("available: "+bis.available());
bis.mark(10);
bis.skip(600);
getFields(bis);
System.out.println("available: "+bis.available());
System.out.println("======");
}
static void testReset1(BufferedInputStream bis)throws NoSuchFieldException,IllegalAccessException,IOException{
System.out.println("testReset function1:");
System.out.println("available: "+bis.available());
getFields(bis);
//bis.reset(); Exception in thread "main" java.io.IOException: Resetting to invalid mark
System.out.println("======");
}
static void testReset2(BufferedInputStream bis)throws NoSuchFieldException,IllegalAccessException,IOException{
System.out.println("testReset function2:");
System.out.println("available: "+bis.available());
getFields(bis);
bis.mark(10);
bis.skip(600);
getFields(bis);
bis.reset();
getFields(bis);
System.out.println("======");
}
//markpos < 0
static void testFill1(BufferedInputStream bis)throws NoSuchFieldException,IllegalAccessException,IOException{
System.out.println("testFill1 function");
System.out.println("available: "+bis.available());
getFields(bis);
System.out.println();
bis.read();
getFields(bis);
System.out.println("======");
}
//第一种情况:pos >= buffer.length&&markpos > 0
static void testFill2(BufferedInputStream bis)throws NoSuchFieldException,IllegalAccessException,IOException{
System.out.println("testFill2 function");
System.out.println("available: "+bis.available());
bis.mark(10);
bis.skip(20);
bis.mark(10);
bis.skip(600);
System.out.println("available: "+bis.available());
getFields(bis);
System.out.println();
bis.read();
getFields(bis);
System.out.println("======");
}
//第二种情况:pos >= buffer.length&&markpos=0&&buffer.length >= marklimit,这种情况将使用两个函数验证是不是要满足markpos=0
static void testFill3(BufferedInputStream bis)throws NoSuchFieldException,IllegalAccessException,IOException{
System.out.println("testFill3 function");
System.out.println("available: "+bis.available());
bis.mark(10);
bis.skip(600);
getFields(bis);
System.out.println();
bis.skip(1);
getFields(bis);
//bis.reset(); Exception in thread "main" java.io.IOException: Resetting to invalid mark
System.out.println("======");
}
//与testFill3唯一区别是在mark调用之前调用read方法,打破markpos=0,结果是marklimit!=-1,可以使用reset(),此时它满足的是pos >= buffer.length&&markpos > 0
static void testFill4(BufferedInputStream bis)throws NoSuchFieldException,IllegalAccessException,IOException{
System.out.println("testFill4 function");
System.out.println("available: "+bis.available());
bis.read();
bis.mark(10);
bis.skip(600);
getFields(bis);
System.out.println();
bis.skip(1);
getFields(bis);
System.out.println();
bis.reset();
getFields(bis);
System.out.println("======");
}
//内存溢出的就不测了
//第4种情况 (1),缓存区由500扩容至600
static void testFill5(BufferedInputStream bis)throws NoSuchFieldException,IllegalAccessException,IOException{
System.out.println("testFill5 function");
System.out.println("available: "+bis.available());
bis.mark(600);
bis.skip(600);
getFields(bis);
System.out.println();
bis.skip(1);
getFields(bis);
System.out.println("======");
}
//(2)唯一区别是mark方法的参数readlimit值不一样,缓存区由500扩容至1000,原因是pos*2<marklimit,此时pos=count
static void testFill6(BufferedInputStream bis)throws NoSuchFieldException,IllegalAccessException,IOException{
System.out.println("testFill6 function");
System.out.println("available: "+bis.available());
bis.mark(1100);
bis.skip(600);
getFields(bis);
System.out.println();
bis.skip(1);
getFields(bis);
System.out.println("======");
}
//testFill7,testFill8测的是(4)中一种极端情况,就是扩容了缓存区大小,后面读数据不修改marklimit,也就是不调用mark(),结果发现它会满足(2)
static void testFill7(BufferedInputStream bis)throws NoSuchFieldException,IllegalAccessException,IOException{
System.out.println("testFill7 function");
System.out.println("available: "+bis.available());
bis.mark(1100);
bis.skip(600);
getFields(bis);
System.out.println();
bis.skip(1);
getFields(bis);
System.out.println();
bis.skip(600);
getFields(bis);
System.out.println();
bis.skip(1);
getFields(bis);
System.out.println("======");
}
static void testFill8(BufferedInputStream bis)throws NoSuchFieldException,IllegalAccessException,IOException{
System.out.println("testFill8 function");
System.out.println("available: "+bis.available());
bis.mark(1100);
bis.skip(600);
getFields(bis);
System.out.println();
bis.skip(1);
getFields(bis);
System.out.println();
bis.skip(600);
getFields(bis);
System.out.println();
bis.skip(1);
getFields(bis);
System.out.println();
bis.skip(200);
getFields(bis);
bis.skip(1);
System.out.println();
getFields(bis);
System.out.println("======");
}
//这种情况没有使用缓存
static void testRead1(BufferedInputStream bis)throws NoSuchFieldException,IllegalAccessException,IOException{
byte[]b=new byte[501];
System.out.println("testRead1 function");
System.out.println("available: "+bis.available());
bis.read(b,0,501);
System.out.println("available: "+bis.available());
getFields(bis);
System.out.println("======");
}
//与testRead1唯一区别是在调用read方法之前调用mark,打破markpos=0,结果是这种方法是使用缓存
static void testRead2(BufferedInputStream bis)throws NoSuchFieldException,IllegalAccessException,IOException{
byte[]b=new byte[501];
System.out.println("testRead2 function");
System.out.println("available: "+bis.available());
bis.mark(10);
bis.read(b,0,501);
System.out.println("available: "+bis.available());
getFields(bis);
System.out.println("======");
}
//输入流数据不够读入的情况
static void testRead3(BufferedInputStream bis)throws NoSuchFieldException,IllegalAccessException,IOException{
byte[]b=new byte[501];
System.out.println("testRead3 function");
System.out.println("available: "+bis.available());
bis.skip(bis.available()-600);
System.out.println("available: "+bis.available());
bis.mark(10);
bis.skip(400);
System.out.println("available: "+bis.available());
getFields(bis);
System.out.println();
int a=bis.read(b,0,500);
getFields(bis);
System.out.println("总共读了"+a+"个数据");
System.out.println("available: "+bis.available());
System.out.println("======");
}
public static void main(String[]args)throws NoSuchFieldException,IllegalAccessException,IOException{
BufferedInputStream bis=new BufferedInputStream(new FileInputStream(new File("我爱学习.txt")),500);
//testSkip1(bis);
//testSkip2(bis);
//testSkip3(bis);
//testReset2(bis);
//testReset2(bis);
//testFill1(bis);
//testFill2(bis);
//testFill3(bis);
//testFill4(bis);
//testFill5(bis);
//testFill6(bis);
//testFill7(bis);
//testFill8(bis);
//testRead1(bis);
//testRead2(bis);
testRead3(bis);
}
}