JAVA Io 流 字符流 编码表 编码和解码的方法

本文深入讲解了计算机中字符编码和解码的基本原理,探讨了字节流与字符流的区别及应用,以及如何正确处理中文字符避免乱码问题。此外,还介绍了字符缓冲流的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字节流,用中文可能会出现乱码

计算机中存储的信息都是二进制表示的

按照某种规则将字符编程二进制 再存储到计算机中,成为编码

按照同样规则,在计算机中二进制数解析出来,成为解码

编码和解码的方式必须一致,否则会导致乱码

不管在哪张码表中,中文的第一个字节一定是负数

编码和解码的方法

编码:

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

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

解码:

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

String​(byte[] bytes, String charsetName):通过指定的字符集解码指定的字节数组来构造新的 String

为什么字节流读取文本文件,可能会出现乱码?

因为字节流一次只读一个字节,但是中文都是多个字节 所以会出现乱码

字符流=字节流+编码表

字符流读取中文的过程:一旦读到负数,就知道是中文,将三个字节作为整体

小结

1,想要进行拷贝,一律使用字节流或者字节缓冲流

2,想要把文件中的数据读到内存中打印或者读到内存中运算,请使用字符输入流。 想要把集合,数组,键盘录入等数据写到文件中,请使用字符输出流

3,GBK码表一个中文两个字节,UTF-8编码格式一个中文3个字节。

字符流写数据

1.创建对象  

FileWriter fw = new FileWriter("text\\a.txt");

注意:如果文件不存在,就创建,但是要保证父路径存在

如果文件存在,就清空文件

2.写数据

注意:

1.写出int类型的整数,实际上是整数在码表上对应的字母

2.如果是字符串数据,就把字符串本身原样写出

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)

写一个字符串的一部分

其中 写字符串用的比较多 

fw.flush() 刷新流,刷新完毕之后写入的信息才会真正到文件里, 还可以继续写数据

3.释放资源

fw.close()  //刷新流并关闭

每次使用完流必须释放资源

字符流读数据

1.创建对象

FileReader  fr = new FileReader()

方法名

说明

int read​()

一次读一个字符数据

int read​(char[] cbuf)

一次读一个字符数组数据

public static void main(String[] args) throws IOException {
 // 创建读的对象
    FileReader fr = new FileReader("test\\a.txt");
//创建字符数组 作为读出来数据的容器
    char[]  chars = new char[1024];
//定义返回的数组长度
    int len ;
//如果新一轮循环读不到数据  就会返回-1
    while ((len=fr.read(chars))!=-1){
       //将读到的所有字符转换成字符串
        System.out.println(new String(chars,0,len));
    }
}

手动录入用户名和密码存入文件

public static void main(String[] args) throws IOException {

    Scanner sc = new Scanner(System.in);
    FileWriter fw = new FileWriter("test\\a.txt");

    System.out.println("请输入用户名");
    String uname = sc.next();
    //写入用户名加换行
    fw.write(uname+"\r\n");

    System.out.println("请输入密码");
    String upsd = sc.next();
    fw.write(upsd);

    fw.close();
    
}

字符缓冲流

字符缓冲流:

BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途

BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途

构造方法:

BufferedWriter​(Writer out)

BufferedReader​(Reader in)

字符缓冲流特有功能 

BufferedWriter: 

void newLine() 写一行分隔符,行分隔符字符串由系统自定义

BufferedReader: 

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

循环遍历读出文件的每行内容:

public static void main(String[] args) throws IOException {
    Scanner sc = new Scanner(System.in);
    BufferedReader br = new BufferedReader(new FileReader("test\\a.txt"));
    String line;
    while ((line= br.readLine())!=null){
        System.out.println(line);
    }
    br.close();
}

IO流小结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值