过滤流简介(1)

过滤流的作用就是在节点流的基础上提供额外功能。

系统预定义过滤流

处理类型字符流字节流
缓存BufferedReader和BufferedWriterBufferedInputStream和BufferedOutputStream
过滤处理FilterReader和FilterWriterFilterInputStream和FilterOutputStream
桥接处理InputStreamReader和OutputStreamWriter
对象处理ObjectInputStream和ObjectOutputStream
数据转换DataInputSteam和DataOutputStream
打印功能PrintWriterPrintStream
行数统计LineNumberReaderLineNumberInputStream
回滚处理PushbackReaderPushbackInputStream

桥接转换流

用途:实现字节流和字符流之间的自动转换,从字节输入流读取字节数据,并按照编码规范转换为字 符;向字节输出流写出数据时,先将字符按照编码规范转换为字节,然后再进行输出。

使用桥接流时应该指定编码字符集名称,以便实现流转换,如果不指定,则使用当前默认编码字符集

  • InputStreamReader用于将一个InputStream自动转换为Reader

  • OutputStreamWriter用于将一个 Writer自动转换为OutputStream

标准输入流System.in

InputStream in=System.in;
        Reader r=new InputStreamReader(in);  //使用桥接字符流将字节流转换为字符流
        while(true){
            System.out.println("请输入:");
            int kk=r.read();
            if('q'==kk)
                break;
            System.out.println((char)kk);
        }

标准输出流System.out

String str="中国123abc";
        Reader r=new StringReader(str);
        OutputStream os=System.out;   //由于System.out是PrintStream,所以直接输出还是正确
        Writer w=new OutputStreamWriter(os);  //将字符输出流转换为字节输出流
        while(true){
            int kk=r.read();
            if(kk==-1)
                break;
            w.write(kk);
        }
        r.close();
        w.close();

InputStreamReader构造器

  • InputStreamReader(InputStream)

  • InputStreamReader(InputStream in, String charsetName) ,例如new InputStreamReader(System.in,"GBK");

  • InputStreamReader(InputStream in, Charset cs),直接使用charsetName编码字符集名称的方式进行设定编码字符集可能会出错,所以可以使用Charset指定编码字符集名称

    Charset gbk = Charset.forName("GBK");  //UnsupportedCharsetException

    没有指定编码字符集则使用系统默认的编码字符集,允许用户自定义编码字符集,如new InputStreamReader(System.in, "iso8859-1")。iso8859-1是用于欧洲地区的编码字符集,使用的是单字节编码。

    OutputStreamWriter构造器和InputStreamReader一致

    缓冲流

    缓冲流是套接在相应的节点流之上,对读写操作提供缓冲功能,以提高读写的效率,并引入一个新方法

    没有使用缓冲流的时间统计  35ms

       引入缓冲流:以浪费内存为代价换取高执行效率

缓冲字节流构造器

  • BufferedInputStream(InputStream)不定义缓存大小,则默认8192

  • BufferedInputStream(InputStream,int)人为设置缓冲大小,int单位字节

  • BufferedOutputStream(OutputStream)

  • BufferedOutputStream(OutputStream,int size)自定义缓存区大小

缓冲字符流构造器

  • BufferedReader(Reader)默认缓冲区大小为8192字符

  • BufferedReader(Reader,int)int用于定义缓冲区的大小

    特殊方法: readLine():String 用于读取一行数据

  • BufferedWriter(Writer)默认缓冲区大小为8192字符

  • BufferedWriter(Writer,int)int用于自定义缓冲区的大小,单位为字符B

    特殊方法

    BufferedReader中提供了一个特殊方法readLine():String,但是在BufferedInputStream中并没有这个 方法。可以整行读取数据,以\r或者\n为分隔符(换行符) 如果读取内容为null【 不是-1】,则表示读取到了流末尾 readLine方法的返回值会自动剔除末尾的换行符

    BufferedWriter中提供了一个方法newLine可以写入一个换行符

    对于输出的缓冲流,写入的数据会受限缓存在内存,使用flush方法可以清空缓存,同时将以前的缓存数 据立即写出

        例如:使用java的输入输出流将一个文本文件的内容读取出来,然后添加行号输出到另外一个文件中

public class Test {
    public static void main(String[] args) throws Exception {
        try (
                Reader r = new FileReader("Test1.java");
                Writer w = new FileWriter("out.java")
        ) {
            int count = 1;
            int kk = 0;
            w.write(count+"\t");
            while ((kk = r.read()) != -1) {
                w.write((char) kk);
                if (kk == '\n') {
                    count++;
                    w.write(count + "\t");
                }
            }
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值