文章目录
- 前言
- 字符流
- 编码表
- 字符串中的编码解码问题
- 字符流写数据
- 字符流读数据
- 总结
前言
因为近期考试原因,还有自身惰性的问题,小编最近停更了一段时间,随之而来的罪恶感让我又开启了自学与创作之路,学习这么久,自己虽然发布了许多博客,但是大部分都是看着笔记写的,导致学的不是很扎实,所以希望自己在以后的博客中能更多的融入自己的一些想法,能将所学知识灵活运用!
字符流
今天主要学习的是字符流和字符缓冲流,上次我们说过,字节流可以操作所有文件,所以为什么还要学习字符流呢?原因有以下几点:
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));
}
}
}
总结
本篇文章介绍了为什么要使用字符流,然后介绍了几种编码表,字符串中的编码
和解码过程以及问题(中文乱码)以及字符流的使用,字符流写数据、字符流读
数据,希望大家多多支持,你们的支持,是我前进的动力!