字符流
创建 1.txt中写入 '"哈" 字时 系统gbk编码占两个字节
1.reader会默认使用系统的字符集去读取比如gbk, 但返回时会从Unicode中去寻找这个字的 编码返回了21704,
因为java只认 Unicode, 当使用 char( 21704 ) 才能由 Unicode转换为 "哈"
2.汉字的高字节以1开头,所以会第一个字节直接合并第二个,就是一次读两个字节
3.在读时,返回-1,因为已经没有了, 如果是两个 字母 " ab" ,一个字母占一个字节,并且高字节不是以1开头,就会一个一个读,所以 显 示 97,98
判断是不是以 1开头, 是字符流才有的
public class test1 {
public static void main(String[] args) throws Exception {
URL resourceAsStream = test1.class.getResource("1.txt");
String path = resourceAsStream.getPath();
String decode = URLDecoder.decode(path, "utf-8");
Reader in = new FileReader(decode);
int read = in.read();
System.out.println(read); 21704
int read2 = in.read();
System.out.println(read2); -1
in.close();
}
}
字节流
1.显示 a b c:
public static void main(String[] args) throws Exception {
FileOutputStream fileOutputStream = new FileOutputStream("D:\\java\\Java源码\\我的小开发maven版\\src\\main\\resources/1.txt");
fileOutputStream.write(97);
fileOutputStream.write(98);
fileOutputStream.write(99);
fileOutputStream.close();
}
2.显示: a 焍 b
public static void main(String[] args) throws Exception {
FileOutputStream fileOutputStream = new FileOutputStream("D:\\java\\Java源码\\我的小开发maven版\\src\\main\\resources/1.txt");
fileOutputStream.write(97);
fileOutputStream.write(-97);
fileOutputStream.write(98);
fileOutputStream.write(98);
fileOutputStream.close();
}
说明只要有一个负的字节就会连上后面一个字节,组成一个汉字(记事本GBK组的), java写入 97 -97 98 98 记事本使用gbk解码时 组成汉字, 必须两个字节才能组成一个汉字(gbk)
fileOutputStream.write(-200); fileOutputStream.write(97); 显示 8a
因为下面 一个直接最大127 -200被转换为整数, 就像 byte b = (byte)-129; 强转时 b 为127
编解码
编码,字符 --->码表--->数字 解码,数字 --->码表--->汉字
1. -2 -1 为Unicode 的标识,以他开头
byte[] bytes = s.getBytes("Unicode");
System.out.println(Arrays.toString(bytes)); [-2, -1, 84, -56]
2.java 以Unicode为标准, 不足两个字节时,会补足为两个 0,97
String s = "a";
byte[] bytes = s.getBytes("Unicode"); [-2, -1, 0, 97]
字符流查码表,字节流不查码表
System.out.println((int)'哈'); 21704
System.out.println((char)21704); 哈