常见的码表如下:
ASCII: 美国标准信息交换码。用一个字节的7位可以表示。
ISO8859-1: 拉丁码表。欧洲码表,用一个字节的8位表示。又称Latin-1(拉丁编码)或“西欧语言”。ASCII码是包含的仅仅是英文字母,并且没有完全占满256个编码位置,所以它以ASCII为基础,在空置的0xA0-0xFF的范围内,加入192个字母及符号, 藉以供使用变音符号的拉丁字母语言使用。从而支持德文,法文等。因而它依然是一个单字节编码,只是比ASCII更全面。
GB2312: 中国的中文编码表。
GBK: 中国的中文编码表升级,融合了更多的中文文字符号。
Unicode: 国际标准码,融合了多种文字。所有文字都用两个字节来表示,Java语言使用的就是unicode。
UTF-8: 最多用三个字节来表示一个字符。
(我们以后接触最多的是iso8859-1、gbk、utf-8)
查看上述码表后,很显然中文的‘中’在iso8859-1中是没有对映的编码的。或者一个字符在2中码表中对应的编码不同,例如有一些字在不同的编码中是有交集的,例如bjg5 和gbk 中的汉字简体和繁体可能是一样的,就是有交集,但是在各自码表中的数字不一样。
字节流:字节流读取的是文件中的二进制数据,读到的数据并不会帮你转换成你看得懂的字符。
字符流: 字符流会把读取到的二进制的数据进行对应 的编码与解码工作。 字符流 = 字节流 + 编码(解码)
输入字符流:
----------| Reader 输入字符流的基类 抽象类
-------------| FileReader 读取文件的输入字符流。
FileReader的用法:
- 找到目标文件
- 建立数据的输入通道
- 读取数据
- 关闭资源
// 使用缓冲字符数组读取文件。 效率高
public static void readTest2() throws IOException {
// 找到目标文件
File file = new File("D:\\Java\\testFile\\假如生活重新开头.txt");
// 建立数据的输入通道
FileReader fileReader = new FileReader(file);
// 建立缓冲字符数组读取文件数据
char[] buf = new char[1024*1024];
int length = 0;
while ((length = fileReader.read(buf)) != -1) {
System.out.print(new String(buf, 0, length));
}
}
public static void readTest1() throws IOException {
// 找到目标文件
File file = new File("D:\\Java\\testFile\\aa.txt");
// 建立数据的输入通道
FileReader fileReader = new FileReader(file);
int content = 0;
while ((content = fileReader.read()) != -1) { // 每次只会读取一个字符,效率低。
System.out.print((char) content);
}
// 关闭资源
fileReader.close();
}