自学Java第三十六课
今天学习了IO流中的字符流,字节流被称为万能流,而字符流必须在自己能看懂文本文档的前提下进行。但对于汉字来说,字节流使用起来便有很多不方便,所以字符流便使用起来。
字符流=字节流+编码表。注:汉字存储的时候,无论使用哪种编码表都会显示负数。
编码表
编码:按某种规则将字符存储在计算机中;解码:按照某种规则,将存储在计算机中的二进制数解析出来。
注:信息存储和读取时,编码规则和解码规则必须保持一致,否则会乱码。
字符集
①一个系统支持的所有字符的集合,包括国家文字、标点符号、图形符号、数字。
②一套字符集至少有一套字符编码,常见字符集:ASCII字符集、GBXXX字符集、Unicode字符集。
ASCII字符集:显示现代英语,包括控制字符和可显示的字符。
GBK:最常用的中文码表。
Unicode:为表达任意语言的任意字符而设计的,称为统一码,包括UTF-8、UTF-16、UTF32。UTF-8克表示Unicode标准中任意字符。
字符串中编码解码问题
编码
byte[] getBytes() | 使用平台默认字符集将String编码为一系列字节,将结果存储在字节数组 |
byte[] getBytes(String charsetName) | 使用指定字符集将String编码为一系列字节,将结果存储在字节数组 |
不同平台中的默认编码集不同,eclipse使用的是GBK,vscode使用的是UTF-8
解码
String(byte[] bytes) | 使用平台默认字符集进行解码,指定字节数组,构建String |
String(byte[] bytes,String charsetName) | 指定字符集解码,指定字符数组构造新的String |
字符流中编码解码问题
字符流抽象基类:Reader字符输入流抽象类 ;Writer字符输出流抽象基类。可以将Reader将数据读入,Writer则是将数据写出。
与编码相关的类:InputStreamReader OutputStreamWriter
字符流写数据的方式
void write(int c) | 写入一个字符 |
void write(int[] abcde) | 写入一个字符数组 |
void write(char[],off,int len) | 写入一个字符数组的一部分 |
void write(String str) | 写入一个字符串 |
void write(String str,off,int len) | 写入一个字符串的一部分 |
释放资源
void flush() | 刷新资源,将数据从缓冲区刷出,可以继续写数据 |
void close() | 释放资源,先刷新再释放,不可以继续写数据 |
读取数据
int read() | 一次读取一个字符数据 |
int read(char[] cubtf) | 一次读取一个字符串数据 |
使用字符流进行文件的复制
字符缓冲流
BufferedWriter:将文本写入字符输出流,缓冲字符,从提供单个字符,数组和字符串高效写入,可指定缓冲区的大小,默认缓冲区足够大
BufferedReader:从字符输入流读取文本,缓冲字符,从提供单个字符,数组和字符串高效写入,可指定缓冲区的大小,默认缓冲区足够大
构造方法
BufferedWriter(Write out) BufferedRaeder(Reader in)
字符缓冲流特有功能
BufferedWriter:void newline() 写一行分隔符,行分隔符由系统属性定义。可以代替\r\n
BufferedReader:public String reafline():读一行文字,包含行的内容的字符串,不包含任何终止字符,如果已达到结尾,显示为null。可以用来终止循环
利用缓冲流的特有功能写复制案例
1 import java.io.BufferedReader; 2 import java.io.BufferedWriter; 3 import java.io.FileReader; 4 import java.io.FileWriter; 5 import java.io.IOException; 6 7 public class text { 8 public static void main(String[] args) throws IOException{ 9 //创建数据源对象 10 BufferedReader br=new BufferedReader(new FileReader("lib\\student.java")); 11 //创建目的地对象 12 BufferedWriter bw=new BufferedWriter(new FileWriter("lib\\j.java")); 13 String line; 14 while((line=br.readLine())!=null){ 15 bw.write(line); 16 bw.newLine(); 17 bw.flush(); 18 } 19 br.close(); 20 bw.close(); 21 } 22 }
明天将会学习IO中的特殊操作流。