字符流,编码表,字符流写数据,字符流读数据

前言

因为近期考试原因,还有自身惰性的问题,小编最近停更了一段时间,随之而来的罪恶感让我又开启了自学与创作之路,学习这么久,自己虽然发布了许多博客,但是大部分都是看着笔记写的,导致学的不是很扎实,所以希望自己在以后的博客中能更多的融入自己的一些想法,能将所学知识灵活运用!

字符流

今天主要学习的是字符流和字符缓冲流,上次我们说过,字节流可以操作所有文件,所以为什么还要学习字符流呢?原因有以下几点:

1.如果利用字节流,把文本文件中的中文,读取到内存中,有可能出现乱码。
2.如果利用字节流,把中文写到文本文件中,也有可能出现乱码。

我们要理解这个过程,首先要知道编码表

编码表

有以下基础知识首先要知道:

1.计算机中存储的信息都是用二进制数表示的。
2.按照某种规则,将字符变成二进制,再存储到计算机中,称为编码。
3.编码和解码的方式必须一致,否则会导致乱码。

简单理解一下,也就是说,存储一个字符 a,首先需要在码表中查到对应的数字是97,然后转换成二进制进行存储.读取的时候,先把二进制解析出来,再转换成97,通过97查找到对应的字符串a,这也就是编码和解码的过程。
上述我们所提到的码表也就是编码表包括:

1.ASCII字符集:
  ASCII:包括了数字,大小写字符和一些常见的标点符号
  注意:ASCII码表中是没有中文的。
  
2.GBK:window系统默认的码表。兼容ASCII码表,也包括了21033个汉字,并支持
  繁体字以及部分日韩文字。
  注意:GBK是中国的码表,一个中文以两个字节的形式存储。但不包括世界上所有
  国家的汉字。
  
  3.Unicode码表:
  	由国际组织ISO制定,是统一的万国码,计算机科学领域里的一项业界标准,容
  	纳世界上大多数国家的所有常见文字和符号。但是因为表示的字符太多了,所
  	以Unicode码表中得出数字不是直接以二进制的形式存储到计算机的。
  	会先通过 UTF-7,UTF-7.5,UTF-8,UTF-16,以及UTF-32进行编码,再存储到计
  	算机。所以我们经常说的UTF-8不是编码表,而是一种编码方式。
  	注意:Unicode是万国码,以UTF-8编码后的一个中文以三个字节的形式存储。	

在这里,我们需要记住两个重点

	1.windows默认使用码表为GBK,一个字符两个字节。
	2.idea和以后工作默认使用Unicode的 UTF-8编解码格式,一个中文三个字节。

字符串中的编码解码问题

方法名说明
byte[] getBytes()使用平台的默认字符集将该String编码为一系列字节
byte[] getBytes(String charsetName)使用指定的字符集将该 String 编码为一系列字节
String (bytes[] bytes)使用平台的默认字符集解码指定的字节数组来创建字符串
String(byte[]bytes,String charset Name)通过指定的字符集解码指定的字节数组来创建字符串

注意:这四个方法都是String 类中的方法。

  • 代码演示:
package com.hcx;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class Demo1 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String s = "中国";
        byte[] bytes1 = s.getBytes();//以系统默认的编码进行编码
        byte[] bytes2 = s.getBytes("utf-8");//以utf-8的编码方式进行编码
        byte[] bytes3 = s.getBytes("gbk");//以gbk的编码方式进行编码
        System.out.println(Arrays.toString(bytes1));
        System.out.println(Arrays.toString(bytes2));
        System.out.println(Arrays.toString(bytes3));
        System.out.println("==================");

        String s1 = new String(bytes1);//以系统默认的方式进行解码
        String s2 = new String(bytes1, "utf-8");//以utf-8的字符集进行解码
        String s3 = new String(bytes1, "gbk");//以gbk字符集的方式进行解码
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
    }
}

  • 控制台输出:
    在这里插入图片描述
    如上,我们也可以看出,IDEA默认编码和解码方式为 UTF-8,并且以UTF-8编码后一个中文用三个字节存储,以GBK编码后一个中文用两个字节存储

字符流写数据

字符流写数据,有两种形式:

	writer:用于写入字符流的抽象父类
	FileWriter:用于写入字符流的抽象子类

一般常用FileWriter
我们下面来介绍它的构造方法

方法名说明
FileWriter(File file)根据给定的 File 对象构造一个 FileWriter 对象
FileWriter(File file, boolean append)根据给定的 File 对象构造一个 FileWriter 对象
FileWriter(String fileName)根据给定的文件名构造一个 FileWriter 对象
FileWriter(String fileName,boolean append)根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象

接下来是它的成员方法

方法名说明
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)写一个字符串的一部分

还有刷新关闭方法

方法名说明
flush()刷新流,之后还可以继续写数据
close()关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据
  • 代码演示:
package com.hcx;

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

public class Demo2 {
    public static void main(String[] args) throws IOException {
        FileWriter fileWriter = new FileWriter("a.txt");
        fileWriter.write(97);//写一个字符
        fileWriter.write(98);
        fileWriter.write(99);
        fileWriter.write("\r\n");

        char[] chs={'a','b','c','d','e'};//写入一个字符数组
        fileWriter.write(chs);
        fileWriter.write("\r\n");

        fileWriter.write(chs,0,3);//写入字符数组的一部分
        fileWriter.write("\r\n");

        fileWriter.write("abcde");//写入一个字符串
        fileWriter.write("\r\n");

        fileWriter.write("abcde",0,3);//写入字符串的一部分
        fileWriter.close();

    }
}
  • 当前模块写 a.txt文件内容:

在这里插入图片描述

字符流读数据

字符流读数据也有两种形式

	Reader:用于读取字符流的抽象父类
	FileReader:用于读取字符流的常用子类

一般用FileWriter
我们接下来介绍它的构造方法

方法名说明
FileReader(File file)在给定从中读取数据的 File 的情况下创建一个新 FileReader
FileReader(String fileName)在给定从中读取数据的文件名的情况下创建一个新 FileReader

接下来是它的成员方法

方法名说明
int read()一次读一个字符数据
int read(char[] cbuf)一次读一个字符数组数据
  • 代码演示:
package com.hcx;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class Demo3 {
    public static void main(String[] args) throws IOException {
        FileReader fileReader = new FileReader("a.txt");

        //一次读取一个数据
        int ch;
        while((ch=fileReader.read())!=-1){
            System.out.print((char)ch);
        }

         //一次读取一个字符数组数据

        char[] chars = new char[1024];
        int len;
        while((len = fileReader.read(chars))!= -1){
            System.out.print(new String(chars,0,len));
        }
    }
}

总结

	本篇文章介绍了为什么要使用字符流,然后介绍了几种编码表,字符串中的编码
	和解码过程以及问题(中文乱码)以及字符流的使用,字符流写数据、字符流读
	数据,希望大家多多支持,你们的支持,是我前进的动力!		
  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

续写青春.

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值