java流概念2


一、过滤流

过滤流就是在节点流的基础上附加功能,在输入之后(后置处理,被装饰对象先执行)或者输出之前(前置 处理,先处理然后被装饰对象执行)进行一下额外的处理,最终实际操作是调用被装饰对象的方法完成工作,依靠这种装饰模式实现在节点流的基础上附加额外功能.当然也允许多个过滤流嵌套从而达到功能累加的目的

自定义流实现循环13加密:

public class Test01 extends FilterReader {
    public Test01(Reader re) {
        super(re);
    }

    public int read() throws IOException {
        int a = super.read();
        if ((a >= 'a' && a <= 'z')) {
            a = (a - 'a' + 13) % 26 + 'a';
        } else if ((a >= 'A' && a <= 'Z')) {
            a = (a - 'A' + 13) % 26 + 'A';
        }
        return a;
    }

}

public class Test02 extends FilterWriter {
    public Test02(Writer re) {
        super(re);
    }
    public void write(int c) throws IOException {
        if (c >= 'a' && c <= 'z') {
            c = (c - 'a' + 13) % 26 + 'a';
        } else if (c >= 'A' && c <= 'Z') {
            c = (c - 'A' + 13) % 26 + 'A';
        }
        super.write(c);
    }
}

public class Test03 {
    public static void main(String[] args) throws IOException {
        Writer w = new FileWriter("aa.txt");
        Reader r = new FileReader("aaaa");
        FilterReader f1 = new Test01(r);
        FilterWriter f2 = new Test02(w);
        int bb;
        while ((bb = f1.read()) != -1) {
            System.out.print((char) bb + "\t");
            f2.write(bb);
        }
        f2.close();
    }
}

样例:加密: 数字:如果不是9的数字,在原来的基础上加1,比如5变成6, 3变成4,如果是9的数字,变成0。 字母字符:如果是非z字符,向右移动一个,比如d变成e, G变成H,如果是z,z->a, Z-A。字符需要保留大小 写非字母字符:比如‘,&^ 保留不变,中文也保留不变

public class Test04 extends FilterReader {
    public Test04(Reader r) {
        super(r);
    }

    public int read() throws IOException {
        int a = super.read();
        if (a >= '0' && a <= '9') {
            a = (a - '0' + 1) % 10 + '0';
        } else if (a >= 'a' && a <= 'z') {
            a = (a - 'a' + 1) % 26 + 'a';
        } else if (a >= 'A' && a <= 'Z') {
            a = (a - 'A' + 1) % 26 + 'A';
        }
        return a;
    }
}
public class Test06 {
    public static void main(String[] args) throws IOException {
        FilterReader f1 = new Test04(new BufferedReader(new FileReader("aa.txt")));
        int a;
        while ((a = f1.read()) != -1) {
            System.out.print((char) a + "\t");
        }
    }
}

二、桥接转换流

InputStreamReader和OutputStreamWriter提供了字节流和字符流之间的桥接转换功能,用于与字节数据到字符 数据之间的转换,无需编程实现将字节拼接为字符

  • 转换流可以在构造时指定其编码字符集
  • InputStreamReader用于将一个InputStream类型的输入流自动转换为Reader字符流
  • OutputStreamWriter用于将一个Writer字符输出流转换为OutputStream字节输出流

三、缓冲流

1.缓冲流是套接在响应的节点流之上,对续写的数据提供缓冲的功能,提高读写的效率,同时增加了一些新方法

2.以介质是硬盘为例,字节流和字符流的弊端:在每一次读写的时候,都会访问硬盘。 如果读写的频率比较高的时 候,其性能表现不佳。为了解决以上弊端,采用缓存流。

3.缓存流在读取的时候,会一次性读较多的数据到缓存中,以后每一次的读取,都是在缓存中访问,直到缓存中的数 据读取完毕,再到硬盘中读取。

构造方法:

  • BuàeredReader(Reader)不定义缓存大小,默认8192
  • BuàeredReader(Reader in, int size)size为自定义缓冲区的大小
  • BuàeredWriter(Writer)
  • BuàeredWriter(Writer out, int size)size为自定义缓冲区的大小
  • BuàeredInputStream(InputStream)
  • BuàeredInputStream(InputStream in, int size)size为自定义缓冲区的大小
  • BuàeredOutputStream(OutputStream)
  • BuàeredOutputStream(OuputStream out, int size)size为自定义缓冲区的大小

缓冲输入流的方法

  • BuàedReader提供了一个方法readLine():String,但是BuàeredInputStream中并没有这个 BuàeredReader提供了readLine方法用于读取一行字符串,以\r或\n分割(换行符) 如果读取内容为null,则表示读取到了流的末尾 readLine方法会自动剔除本行内容末尾的换行符
  • BuàeredWriter提供了newLine方法用于写入一个行分隔符 对于输出的缓冲流,写入的数据会先在内存中缓存,使用Öush方法会使内存中的数据立即写出

四、键盘输入

System.in:InputStream用于指代系统默认的输入设备—键盘
方法read():int 可以实现代码执行到这里则会阻塞等待,只要输入数据为止

public class Test08 {
    public static void main(String[] args) throws IOException {
        BufferedReader re = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("请输入");
        String str = "";
        while ((str = re.readLine()).trim().length() > 0) {
            if ("quit".equals(str)) {
                break;
            }
            System.out.println(str);
        }
        re.close();
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值