阶段二31_面向对象高级_IO[字符串编码解码,字符流读写]

文章详细阐述了字符串中的Unicode编码与GBK编码的区别,以及Java中如何进行编码解码操作。通过示例代码展示了`getBytes()`和`String(byte[])`方法的使用。同时,讨论了字符流在读写数据时的角色,特别是在处理中文字符时的注意事项,如GBK码表和UTF-8编码格式的字节差异。最后,提供了字符流读写文件的实例,包括写入文件和从文件读取数据的方法。

知识点:

1.字符串中的编码解码
2.字符流读写数据: FileWriter和FileReader

一.Unicode码表

大吉大利----查询-----> Unicode ---码表中对应的数字-------> 编码utf-8 --------转换二进制------>     存储                                                                               
今晚吃鸡<--展示------  码表    <--查询----码表中对应的数字---- 解码utf-8 <-------读取二进制----   计算机
重点:
windows默认使用码表为:GBK,一个字符两个字节。
idea和以后工作默认使用Unicode的UTF-8编解码格式,一个中文三个字节

二.字符串中的编码解码问题

1.编码:

byte[] getBytes():使用平台的默认字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
byte[] getBytes(String charsetName):使用指定的字符集将该 String编码为一系列字节,将结果存储到新的字节数组中 

2.解码:

String(byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的 String
String(byte[] bytes, String charsetName):通过指定的字符集解码指定的字节数组来构造新的 String

3.代码案例实现:

public class CharStreamDemo2 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        //1.编码
        //byte[] getBytes():
        //使用平台的默认字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
        //byte[] getBytes(String charsetName):
        //使用指定的字符集将该 String编码为一系列字节,将结果存储到新的字节数组中
        String s = "黑马程序员";
        //利用idea默认的UTF-8将中文编码为一系列的字节
        byte[] bytes1 = s.getBytes(); //byte[] bytes1 = s.getBytes("UTF-8");
        System.out.println(Arrays.toString(bytes1));
        byte[] bytes2 = s.getBytes("GBK");
        System.out.println(Arrays.toString(bytes2));

        //2.解码
        //String(byte[] bytes):
        //通过使用平台的默认字符集解码指定的字节数组来构造新的 String
        //String(byte[] bytes, String charsetName):
        //通过指定的字符集解码指定的字节数组来构造新的 String
        byte [] bytes1 = {-23, -69, -111, -23, -87, -84, -25, -88, -117, -27, -70, -113, -27, -111, -104};//UTF-8
        byte [] bytes2 = {-70, -38, -62, -19, -77, -52, -48, -14, -44, -79}; //gbk
        //利用默认的UTF-8进行解码
        String s1 = new String(bytes1);
        System.out.println(s1);//黑马程序员
        //利用指定的GBK进行解码
        String s2 = new String(bytes2,"gbk");
        System.out.println(s2);//黑马程序员
    }
}

三.字符流

1.字符流读取中文的过程

   字符流 = 字节流 + 编码表
   基础知识:不管是在哪张码表中,中文的第一个字节一定是负数。
   a黑马--------> 97 | -23 -69 -111 | -23 -87 -84

2.结论规则

  (1)想要进行拷贝,一律使用字节流或者字节缓冲流。
  (2)想要把文件中的数据读到内存中打印或者读到内存中运算,请使用字符输入流。
  想要把集合,数组,键盘录入等数据写到文件中,请使用字符输出流
  (3)GBK码表一个中文两个字节,UTF-8编码格式一个中文3个字节

四.字符流写数据

1.字符流写数据的5种方式

void write(int c)	写一个字符
void write(char[] cbuf)	写入一个字符数组
void write(char[] cbuf, int off, int len)	写入字符数组的一部分
void write(String str)	写一个字符串
void write(String str, int off, int len)	写一个字符串的一部分

2.创建字符输出流对象注意事项

   创建字符输出流对象,注意事项:
       如果文件不存在,就创建。但是要保证父级路径存在。
       如果文件存在就清空。
   写数据,注意事项:
       写出int类型的整数,实际写出的是整数在码表上对应的字母。
       写出字符串数据,是把字符串本身原样写出
   释放资源,注意事项:
       每次使用完流必须要释放资源。

3.代码实现:

public class CharStreamDemo3 {
    public static void main(String[] args) throws IOException {
        //1.创建字符输出流的对象
        //FileWriter fw = new FileWriter(new File("charstream\\a.txt"));
        FileWriter fw = new FileWriter("charstream\\a.txt");

        //2.1.void write(int c)            写一个字符
        fw.write(97);
        fw.write(98);
        fw.write(99);
        //2.2.void write?(char[] cbuf)      写出一个字符数组
        char [] chars = {97,98,99,100,101};
        fw.write(chars);
        //2.3.void write(char[] cbuf, int off, int len)    写出字符数组的一部分
        char [] chars = {97,98,99,100,101};
        fw.write(chars,0,3);
        //2.4void write(String str)       写一个字符串
        String line = "黑马程序员abc";
        fw.write(line);
        //2.5void write(String str, int off, int len)     写一个字符串的一部分
        String line = "黑马程序员abc";
        fw.write(line,0,2);

        //3.释放资源
        fw.close();
    }
}

五.字符流写数据的5种方式

flush()	刷新流,还可以继续写数据
close()	关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据
public class CharStreamDemo5 {
    public static void main(String[] args) throws IOException {
        FileWriter fw = new FileWriter("charstream\\a.txt");
        fw.write("黑马程序员");
        //flush()刷新流。刷新完毕之后,还可以继续写数据
        fw.flush();
        //close()关闭流前会调用flush方法。释放资源。一旦关闭,就不能写数据
        fw.close();
    }
}

六.字符流读数据的2种方式

int read()	一次读一个字符数据
int read(char[] cbuf)	一次读一个字符数组数据
public class CharStreamDemo6 {
    public static void main(String[] args) throws IOException {
        //创建字符输入流的对象
        //FileReader fr = new FileReader(new File("charstream\\a.txt"));
        FileReader fr = new FileReader("charstream\\a.txt");

        //1.read()一次读取一个字符
        int ch;
        while((ch = fr.read()) != -1){
            System.out.println((char) ch);
        }
        
        //2.read(chars)一次读取多个字符
        //创建一个数组
        char [] chars = new char[1024];
        int len;
        //read方法还是读取,但是是一次读取多个字符
        //他把读到的字符都存入到chars数组。
        //返回值:表示本次读到了多少个字符。
        while((len = fr.read(chars))!=-1){
            System.out.println(new String(chars,0,len));
        }
        //释放资源
        fr.close();
    }
}

七.案例:保存键盘录入的数据

需求:将用户键盘录入的用户名和密码保存到本地实现永久化存储
步骤:
用户键盘录入用户名
将用户名和密码写到本地文件中
public class CharStreamDemo8 {
    public static void main(String[] args) throws IOException {
        //将键盘录入的用户名和密码保存到本地实现永久化存储
        //要求:用户名独占一行,密码独占一行
        //分析:
        //1,实现键盘录入,把用户名和密码录入进来
        Scanner sc = new Scanner(System.in);
        System.out.println("请录入用户名");
        String username = sc.next();
        System.out.println("请录入密码");
        String password = sc.next();

        //2.分别把用户名和密码写到本地文件。
        FileWriter fw = new FileWriter("charstream\\a.txt");
        //将用户名和密码写到文件中
        fw.write(username);
        //表示写出一个回车换行符 windows \r\n  MacOS \r  Linux \n
        fw.write("\r\n");
        fw.write(password);
        //刷新流
        fw.flush();
        //释放资源
        fw.close();
    }
}

八.更多内容

http://www.gxcode.top/code
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java之书

会持续更新实用好的文章谢谢关注

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值