IO流--字符流

字符流

字符流的概述

字符流 = 字节流 + 编码表

用字节流赋值文本文件时, 文本文件也会出现中文, 但是没有问题, 原因是最终底层操作会自动进行字节拼接中文, 根据汉字的编码第一个字节都是负数值作为识别条件.

  • 字符编码

    • ASCII

    • GB2312

    • GBK ( 两个字节 )

    • GB18030

    • Unicode

      • UTF-8 ( 三个字节 )

      • UTF-16

      • UTF-32

一个汉字的存储, 如果是 GBK 编码, 占用两个字节, 如果是 UTF-8 字节, 占用三个字节

在这里插入图片描述

编码和解码

  • 字符串中的编码与解码

    • 编码

      • getBytes(): 使用平台 ( IDEA ) 默认字符集

      • getBytes(String charsetName): 设置字符集

    • 解码

      • String(byte[] bytes); 使用平台 ( IDEA ) 默认字符集解码

      • String(byte[] bytes, String charsetName); 使用指定字符集解码
        .

demo:解码和编码

package com.itxs.demo02;

import java.io.UnsupportedEncodingException;

import java.util.Arrays;

/**
 * @Classname : demo02
 * @Description : TODO 编码和解码
 * @Author : lin_refuel@qq.com
 */
public class demo02 {
    public static void main(String[] args) throws UnsupportedEncodingException {
         String s01 = "i'm Licinius,我是李锡尼";
         //通过UTF-8的编码成字节数组
        byte[] uf = s01.getBytes("UTF-8");
        System.out.println(Arrays.toString(uf));//解析uf
        //通过GBK的方式进行解析
       //TODO byte[] gbk = s01.getBytes("GBK");
        //TODO System.out.println(Arrays.toString(gbk));
        //**********************************************
        //通过GBK解码的方式解析UTF-8的解码形式的字节数组
        System.out.println(new String(uf,"GBK"));
        //运行结果:i'm Licinius,鎴戞槸鏉庨敗灏� 汉字部分会出乱码
        //TODO 字符串进行解码成为字节数组时,要根据使用的解码方式,
        //TODO 例如GBK去解析UTF-8解析的字节数组时,会出乱码
    }
}

字符流写入文件

package com.itxs.demo02;

import java.io.*;

/**
 * @Classname : demo03
 * @Description : TODO 字符流写入文件
 * @Author : lin_refuel@qq.com
 */
public class demo03 {
    public static void main(String[] args) throws IOException {
           //定义一个写入类
        FileOutputStream fis = new FileOutputStream("D:/JAVA/ce/mini.txt");
          //写入类封装成字符类
        OutputStreamWriter ow = new OutputStreamWriter(fis, "UTF-8");
          //写入两个字符
          ow.write("小肆");
          //进行shuax
          ow.flush();
        //关闭ow流
        ow.close();//关闭封装的写入字符类ow,同时也会关闭写入类fis
        //TODO *******************************************************************
        //输出写入的字符
        //对读取进行封装,封装成字符读取类
        InputStreamReader IR = new InputStreamReader(new FileInputStream("D:/JAVA/ce/mini.txt"),"UTF-8");
        int len; //返回的字节
        while((len = IR.read())!=-1)
        System.out.print((char)len);
        IR.close();//关闭读取字符类
    }
}

字符流读取

package com.itxs.demo02;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * @Classname : demo04
 * @Description : TODO 字符流读取
 * @Author : lin_refuel@qq.com
 */
public class demo04 {
    public static void main(String[] args) throws IOException {
         //封装一个字节流读取,封装成为字符流读取类
        InputStreamReader ir = new InputStreamReader(new FileInputStream("D:/JAVA/ce/mini.txt"));
        // TODO ************************************************************************************
        //一次读取一个字符的方式
        /* int len;
        while((len = ir.read())!= -1)
            System.out.print((char)len);*/
        //关闭字符流读取
        // TODO**************************************************************************************
        //一次读取一个 TODO 字符数组
        char[] c = new char[1024];
        int len;//字符的有效长度
        while((len = ir.read(c))!= -1)
            System.out.println(new String(c,0,len));//字符数组,转字符串的形式
        ir.close();
    }
}

字符流文件复制操作

package com.itxs.demo02;

import java.io.*;

/**
 * @Classname : demo06
 * @Description : TODO 字符号流复制文件
 * @Author : lin_refuel@qq.com
 */
public class demo06 {
    public static void main(String[] args) throws IOException {
         //封装一个字节流写入封装成字符流写入类,默认UTF-8
        OutputStreamWriter ow = new OutputStreamWriter(new FileOutputStream("D:/JAVA/ce/mini2.txt"));
        //封装一个字节流读取封装成为字符流读取
        InputStreamReader ir = new InputStreamReader(new FileInputStream("D:/JAVA/ce/mini.txt"));
        //TODO*****************************************************************
        //先读取后写入
        //一次读取一个字符
        /* int len;
        while((len = ir.read())!= -1) {
            ow.write(len);
            ow.flush(); //手动刷新
        }*/
        //TODO ****************************************************************
        //一次读取一个字符数组
        char[] r2 = new char[1024];
        int len2;
        while((len2 = ir.read(r2))!=-1){
            ow.write(r2,0,len2);
            ow.flush();//手动刷新
        }
        ow.close();
        ir.close();
    }
}

FileReader和Filewrite

package com.itxs.demo02;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 * @Classname : demo07
 * @Description : TODO FileReader 和 FileWrite
 * @Author : lin_refuel@qq.com
 */
public class demo07 {
    public static void main(String[] args) throws IOException {
        //读取"D:/JAVA/ce/mini.txt"
        FileReader fr = new FileReader("D:/JAVA/ce/mini.txt");
        //写入"D:/JAVA/ce/Myyy.txt"
        FileWriter fw = new FileWriter("D:/JAVA/ce/Myyy.txt");
        //TODO******************************************************************
        //一次读取一个字节
//        int r ;
//        while((r = fr.read())!=-1){
//            fw.write(r);
//            fw.flush();
//        }
//
        //TODO *****************************************************************
        //一次读取一个字符数组
        char[] c1 = new char[1024];
        int len;//有效字符长度
        while((len = fr.read(c1))!=-1){
            fw.write(c1,0,len);
            fw.flush();
        }
        fr.close();
        fw.close();
    }
}

字符流缓冲区

package com.itxs.demo02;

import java.io.*;

/**
 * @Classname : demo08
 * @Description : TODO 字符流的缓冲区
 * @Author : lin_refuel@qq.com
 */
public class demo08 {
    public static void main(String[] args) throws IOException {
          //读取的原文件
         String source = "D:/JAVA/ce/MyTest.txt";
          //创造的新的文件,并写入
         String target = "D:/JAVA/ce/MY2txt.txt";

         //读取类缓冲
        BufferedReader br = new BufferedReader(new FileReader(source));
        //写入类缓冲
        BufferedWriter bw = new BufferedWriter(new FileWriter(target));
        //一个字符数组
        char[] cs = new char[1024];//1k的大小
        int len;//有效长度
        //通过循环进行写入
        while((len = br.read(cs))!=-1){
            bw.write(cs,0,len);
            bw.flush();//手动刷新
        }
        //关闭读取和写入
        br.close();
        bw.close();
    }
}

缓冲区的特有方法

package com.itxs.demo02;

import java.io.*;
import java.util.stream.Stream;

/**
 * @Classname : demo09
 * @Description : TODO 字符流缓冲区的特有方法,一行一行输出
 * @Author : lin_refuel@qq.com
 */
public class demo09 {
    public static void main(String[] args) throws IOException {
         //目标文件
         String scr = "D:/JAVA/ce/MyTest.txt";
         //写入文件
         String copy = "D:/JAVA/ce/MyNewTest.txt";
        // 读取类进行封装
        BufferedReader br = new BufferedReader(new FileReader(scr));
        // 写入类进行封装
        BufferedWriter bw = new BufferedWriter(new FileWriter(copy));
        // 调用方法
        String sc;
        //循环写入
        while ((sc = br.readLine())!=null){
            bw.write(sc);
            bw.newLine();
            bw.flush();
        }
        //关闭读取和写入
        br.close();
        bw.close();
    }
}

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值