1.1字符流出现的原因
由于字节流操作中文不方便,所以需要java提供字符流。
字符流=字节流+编码表
注:在用字节流复制文本时,文本文件中也有中文,但是为什么没有出现问题?原因是最终底层操作会自动进行字节拼接成中文,那又是如何识别中文的呢? 汉字无论采用哪种编码格式在存储时第一个字节都是负数。
UTF-8:一个汉字对应三个字节
GBK:一个汉字 对应两个字节
1.2编码表
基础知识:
按照某种规则,将字符存储到计算机中叫编码;将存储在计算机中的二进制数按照某种规则解析出来叫解码。
字符集:ASC||、UTF-8、GBK等。
1.3字符串中解码编码问题
编码方法:
`String s = "中国";
byte[] bys = s.getBytes();//[-28, -72, -83, -27, -101, -67],采用默认字符集UTF-8
byte[] bys = s.getBytes("UTF-8");//[-28, -72, -83, -27, -101, -67]
//byte[] bys = s.getBytes("GBK");//[-42, -48, -71, -6]
System.out.println(Arrays.toString(bys));
解码方法:
String ss = new String(bys);//采用默认字符集UTF-8
//String ss = new String(bys,"UTF-8");
//String ss = new String(bys,"GBK");
System.out.println(ss);
`注:采用什么样的编码规则就要用那个规则解码,否则会出现乱码。``
1.4字符流中解码编码问题
- OutputStreamWrite:从字符流到字节流,使用指定的编码将写入的字符编码为字节。
OutputStreamWriter osw = new OutputStreamWriter(newFileOutputStream("myByteStream\\ows.txt"),"GBK");
osw.write("中国");
osw.close();
- InputStreamWrite::从字节流到字符流,使用指定的编码将其解码为字符。
InputStreamReader isr = new InputStreamReader(new FileInputStream("myByteStream\\ows.txt"),"GBK");
//一次读取一个字节数组
int len;
while((len = isr.read()) != -1){
System.out.println((char)len);
}
isr.close();
1.5字符流写数据的五种方式
- 写入一个字符
osw.write(98);
//注意:字符流写数据时,写入的数据会暂存在缓冲区中,需要使用刷新流数据才会写入文件。刷新过后可以继续写数据
osw.flush();
- 写入一个字符数组
char[] ch = {'a','b','c','d','e'};
osw.write(ch);
- 写入一个字符数组的一部分
osw.write(ch,0,3);
- 写入一个字符串
String s = "中华民族伟大复兴";
osw.write(s);
- 写入字符串的一部分
osw.write(s,0,4);
osw.close();//关闭流,释放资源。但在关之前会先刷新,一旦关闭就不能再写数据。
1.6字符流读数据的两种方式
- 一次读一个字符数据
InputStreamReader isr = new InputStreamReader(new FileInputStream("myByteStream\\ows.txt"));
//一次读一个字符数据
int read;
while((read = isr.read()) != -1){
System.out.println((char)read);
}
- 一次读一个字符数组数据
char[] ch = new char[1024];
int len;
while((len = isr.read(ch)) != -1){
System.out.println(new String(ch,0,len));//new String()将字符数组转化为字符串
}
1.7字符缓冲流
- BufferedWriter:高效写入
- BufferedReader:高效读取
*特有功能:
*BufferedWriter:void nextLine() 写一行分隔符
BufferedReader:String readLine()读一行文字