字符流,编码表,字符流写数据,字符流读数据
创始人
2024-01-21 08:50:23
0

文章目录

  • 前言
  • 字符流
  • 编码表
  • 字符串中的编码解码问题
  • 字符流写数据
  • 字符流读数据
  • 总结

前言

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

字符流

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

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));}}
}

总结

	本篇文章介绍了为什么要使用字符流,然后介绍了几种编码表,字符串中的编码和解码过程以及问题(中文乱码)以及字符流的使用,字符流写数据、字符流读数据,希望大家多多支持,你们的支持,是我前进的动力!		

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...