IO流--字符流

为什么会出现字符流?

由于字节流操作中文不是特别的方便,通过上篇博客我们可以知道字节流操作下的中文我们是看不懂的,所以Java就提供了字符流

什么是字符流?

字符流=字节流+编码表

编码表如下

用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行

字节拼接成中文,如何识别中文的呢?

汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数,所以当我们看到第一个字节为负数的时候就知道这是中文。

下面我们讨论字符流中都有哪些基础知识:

编码与解码

        String s ="中国";
        //编码
        byte[] bys=s.getBytes();
        //解码
        String ss = new String (bys);
        //输出
        System.out.println("编码:"+bys);
        System.out.println("解码:"+ss);

字符流写数据的五种方式 
 

        //创建一个使用默认字符编码的OutputStreamWrite并创建一个文件输出流文件用于写数据
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("itheima\\osw.txt"));
        //写一个字符
        osw.write("97");
        //写一个字符数组
        char[] chs = {'a', 'b', 'c', 'd'};
        osw.write(chs);
        //写字符数组的一部分
        osw.write(chs, 0, chs.length);
        osw.write(chs, 1, 3);
        //写一个字符串
        osw.write("abcde");
        //写一个字符串的一部分
        osw.write("abcde", 0, "abcde".length());
         //刷新流
        osw.flush();
        //释放流
        osw.close();
        

flush()刷新提交没有提交的数据

close()每次释放流之前都会进行一次刷新来避免没有提交的数据

所以上面的代码中就可以省略刷新流

字符流读数据的两种方式

    //创建一个使用默认字符集的InputStreamReader并指定一个输入字符流文件用于读数据
    InputStreamReader isr =new InputStreamReader(new FileInputStream("itheima\\isr.txt"));
    //一次读一个字符数据
    int ch
    while((ch=isr.read())!=-1){
        System.out.print((char) ch);
    }
    //一次读一个字符数组数据
    char[]chs=new char[1024];
    int len;
    while((len=isr.read(chs))!=-1){
        System.out.println(new String(chs,0,len));
    }
     //释放资源
        isr.close();

字符流复制文件

        //创建一个使用默认字符编码的OutputStreamWrite并创建一个txt文件用于写数据
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("itheima\\osw.txt"));
        //创建一个使用默认字符集的InputStreamReader并指定一个输入字符流文件用于读数据
        InputStreamReader isr = new InputStreamReader(new FileInputStream("itheima\\isr.txt"));
        //字符流复制文件
        char[] chs =new char[1024];
        int len ;
        while((len=isr.read(chs))!=-1){
            osw.write(chs,0,len);
        }

数据源和目的地的分析

数据源:myCharStream\\ConversionStreamDemo.java--读数据--Reader--InputStreamReader--FileReader

目的地:myCharStream\\Copy.java--写数据--Writer--OutputStreamWriter--FileWriter

强调:为了简化书写,我们用了转换流的具体的直接子类(FileReader\FileWriter),但是字符流中如果涉及编码和解码问题还得使用转换流InputStreamReader和OutputStreamWriter

字符缓冲流

//创建字符缓冲输出流
BufferedWriterbw=newBufferedWriter(newFileWriter("idea_test\\bw.txt"));
//写数据三步骤
for(inti=0;i<10;i++){
bw.write("hello"+i);
bw.write("\r\n");
bw.newLine();
bw.flush();
}
//释放资源
bw.close();
//创建字符缓冲输入流
BufferedReaderbr=newBufferedReader(newFileReader("idea_test\\br.txt"));
Stringline;
while((line=br.readLine())!=null){
System.out.println(line);
}
//释放资源
br.close();

字符缓冲流特有功能:

newLine();行分隔符,由系统属性定义

readLine();读一行文字。结果包含行的内容的字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null。

IO流小结

 

 

 

 

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值