廖雪峰Java6 IO编程-2input和output-4Filter模式

1.JDK提供的InputStream分为两类:

  • 直接提供数据的InputStream
    * FileInputStream:从文件读取
    * ServletInputStream:从HTTP请求读取数据
    * Socket.getInputStream():从TCP连接读取数据
  • 提供额外附加功能的FilterInputStream
    * 如果要给FileInputStream添加缓冲功能:
    • BufferedFileInputStream extends FileInputStream
      * 如果要给FileInputStream添加计算机签名的功能:
    • DigestFileInputStream extends FileInputStream
      * 如果要给FileInputStream添加加密/解密功能:
    • CipherFileInputStream extends FileInputStream
  • 组合功能而非继承的设计模式称为Filter模式(或者Decorator模式)
  • 通过少量的类实现了各种功能的组合
//演示代码
InputStream input = new GZIPInputStream(//直接读取解压缩包的内容
    new BufferedInputStream(//提供缓冲的功能
    new FileInputStream("test.gz"))); 

1418970-20190405151516336-1326050265.jpg

廖雪峰示例中的CountInputStream有错误,当读取完毕后,返回-1,而count再读取完毕后,会减1,导致结果不一样。运行结果如下。只需要将count的初始值设置为1即可。

public class CountInputStream extends FilterInputStream {
    int count=0;
    public CountInputStream(InputStream in) {
        super(in);
    }
    //重写read方法,使用count计数
    public int read(byte[] b,int off,int len) throws IOException {
        int n = super.read(b,off,len);
        count += n;
        System.out.println(count);
        return n;//最后返回-1,count-1
    }
}
public class Main {
    static void printCount1(List<Integer> list) throws IOException{
        try(InputStream input = new GZIPInputStream(
                        new BufferedInputStream(
                                new FileInputStream("./src/main/java/com/testList/test.gz")))){
            byte[] buffer = new byte[1024];//创建竹筒
            int count=0;
            int n ;
            while((n=input.read(buffer))!=-1){
                count += n;
                list.add(n);
            }
            System.out.println("直接读取的和:"+count);
            System.out.println("直接读取得到的集合的和"+getSum(list));
        }
    }
    static void printCount2(List<Integer> list) throws IOException{
        try(CountInputStream input = new CountInputStream(
                new GZIPInputStream(
                        new BufferedInputStream(
                                new FileInputStream("./src/main/java/com/testList/test.gz"))))){
            byte[] buffer = new byte[1024];
            int n;
            while((n=input.read(buffer))!=-1){
                list.add(n);
//                System.out.println();
            }
            System.out.println("通过CountInputStream获取的和:"+input.count);
            System.out.println("通过CountInputStream获取的集合的和:"+getSum(list));
        }
    }
    static Integer getSum(List<Integer> list){
        int sum = 0;
        for(int i=0;i<list.size();i++){
            sum += list.get(i);
        }
        return sum;
    }
    public static void main(String[] args) throws IOException {
        List<Integer> list1 = new LinkedList<>();
        List<Integer> list2 = new LinkedList<>();
        printCount2(list2);
        printCount1(list1);
        //从结果
        System.out.println(list1);
    }
}

1418970-20190405181857923-1913670481.png

2.总结

  • Java IO使用Filter模式为InputStream/OutputStream增加功能
  • 可以把一个InputStream和任意FilterInputStream组合
  • 可以把一个OutputStream和任意FilterOutputStream组合
  • Filter模式可以在运行期动态增加功能(又成Decorator模式)

转载于:https://www.cnblogs.com/csj2018/p/10659414.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值