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