BufferedInputStream方法测试

这篇博客主要是测试验证上篇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);
		
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值