为什么会出现字符流:字符流介绍,由于字节流擦做中文不是特别方便,所有java就提供字符流:
字符流 = 字节流 + 编码表
中文的字节 存储方式:
用字节流复制文本文件时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文,如何识别是中文的了?
汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数。
编码表:
什么是字符集:是一个系统支持的所有字符的集合,包括各国际文字,标点符号,图形符号,数字等
计算机要准确的存储和识别各种字符集符号,就需要进行字符编码,一套字符集必然至少有一套字符编码,常见的字符集有ASCII字符集,GBXXX字符集,Unicode字符集等
字符中的编码解码问题:
相关方法;
public static void main(String[] args) throws Exception, UnknownHostException {
//编码
String s = "苏小小";
byte[] gbks = s.getBytes(StandardCharsets.UTF_8);
System.out.println(Arrays.toString(gbks));
}
解码:
byte[] gbkBytes = {-24, -117, -113, -27, -80, -113, -27, -80, -113};
String str = new String(gbkBytes, "UTF-8");
System.out.println(str);
字符流中的编码和解码问题:
字符流中和编码解码问题相关的两个类:
InputStreamReaer:是从字节流到字符流的桥梁
它读取字节,并使用指定的编码将其解码为字符。
它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。
OutputStreamWriter:是从字符流到字节流的桥梁
是从字符流到字节流的桥梁,使用指定的编码将写入的字符编码为字节
它使用的字符集可以又名称指定,也可以被明确指定,或者可以接受平台的默认自妒忌
构造方法:
我们来用代码
public static void main(String[] args) throws Exception, UnknownHostException {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\suxiaoxiao\\sisi.txt"), StandardCharsets.UTF_8);
osw.write("李思思");
osw.close();
InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\suxiaoxiao\\sisi.txt"),StandardCharsets.UTF_8);
char[] chs = new char[1024];
int ch;
while ((ch=isr.read(chs))!=-1) {
System.out.print(new String(chs,0,ch));
}
isr.close();
}
字符流写数据的几种方式:
字符流读数据的两种方式:
字符缓冲流:
字符缓冲流介绍:
BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。
BufferReader:从字符输入流读取文本,缓冲字符,已提供字符,数组和行的高校读取,可以指定缓冲区大小,或者可以使用默认大小。
我们来用代码演示下:
public static void main(String[] args) throws Exception, UnknownHostException {
BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\suxiaoxiao\\sisi.txt"));
bw.write("苏小小");
bw.write("是个大美女");
bw.close();
BufferedReader br = new BufferedReader(new FileReader("D:\\suxiaoxiao\\sisi.txt"));
//一次读取一个字符数组数据
char[] chs = new char[1024];
int len;
while((len = br.read(chs)) != -1){
System.out.print(new String(chs,0,len));
}
br.close();
}