11.16字符流

1.1字符流出现的原因

由于字节流操作中文不方便,所以需要java提供字符流。
字符流=字节流+编码表
注:在用字节流复制文本时,文本文件中也有中文,但是为什么没有出现问题?原因是最终底层操作会自动进行字节拼接成中文,那又是如何识别中文的呢? 汉字无论采用哪种编码格式在存储时第一个字节都是负数。
UTF-8:一个汉字对应三个字节
GBK:一个汉字 对应两个字节

1.2编码表

基础知识:
按照某种规则,将字符存储到计算机中叫编码;将存储在计算机中的二进制数按照某种规则解析出来叫解码
字符集:ASC||、UTF-8、GBK等。

1.3字符串中解码编码问题

编码方法:


`String s = "中国";
 byte[] bys = s.getBytes();//[-28, -72, -83, -27, -101, -67],采用默认字符集UTF-8
 byte[] bys = s.getBytes("UTF-8");//[-28, -72, -83, -27, -101, -67]
 //byte[] bys = s.getBytes("GBK");//[-42, -48, -71, -6]
 System.out.println(Arrays.toString(bys));

解码方法:

 String ss = new String(bys);//采用默认字符集UTF-8
  //String ss = new String(bys,"UTF-8");
  //String ss = new String(bys,"GBK");
  System.out.println(ss);

`注:采用什么样的编码规则就要用那个规则解码,否则会出现乱码。``

1.4字符流中解码编码问题

  • OutputStreamWrite:从字符流到字节流,使用指定的编码将写入的字符编码为字节。
 OutputStreamWriter osw = new     OutputStreamWriter(newFileOutputStream("myByteStream\\ows.txt"),"GBK");
 osw.write("中国");
 osw.close();
  • InputStreamWrite::从字节流到字符流,使用指定的编码将其解码为字符。
 InputStreamReader isr = new InputStreamReader(new FileInputStream("myByteStream\\ows.txt"),"GBK");
//一次读取一个字节数组
        int len;
        while((len = isr.read()) != -1){
    
    
            System.out.println((char)len);
        }
 isr.close();

1.5字符流写数据的五种方式

  1. 写入一个字符
osw.write(98);

//注意:字符流写数据时,写入的数据会暂存在缓冲区中,需要使用刷新流数据才会写入文件。刷新过后可以继续写数据

osw.flush();
  1. 写入一个字符数组
char[] ch = {
    
    'a','b','c','d','e'};
 osw.write(ch);
  1. 写入一个字符数组的一部分
osw.write(ch,0,3);
  1. 写入一个字符串
 String s = "中华民族伟大复兴";
 osw.write(s);
  1. 写入字符串的一部分
osw.write(s,0,4);
osw.close();//关闭流,释放资源。但在关之前会先刷新,一旦关闭就不能再写数据。

1.6字符流读数据的两种方式

  1. 一次读一个字符数据
 InputStreamReader isr = new InputStreamReader(new FileInputStream("myByteStream\\ows.txt"));
        //一次读一个字符数据
       int read;
       while((read = isr.read()) != -1){
    
    
           System.out.println((char)read);
                  }
  1. 一次读一个字符数组数据
char[] ch = new char[1024];
        int len;
        while((len = isr.read(ch)) != -1){
    
    
            System.out.println(new String(ch,0,len));//new String()将字符数组转化为字符串
        }

1.7字符缓冲流

  • BufferedWriter:高效写入
  • BufferedReader:高效读取

*特有功能
*BufferedWriter:void nextLine() 写一行分隔符
BufferedReader:String readLine()读一行文字

Guess you like

Origin blog.csdn.net/weixin_42226721/article/details/121348683