字符流(掌握)
1、字节流操作中文数据不是特别的方便,所以就出现了转换流。
转换流的作用就是把字节流转换字符流来使用。
2、转换流其实是一个字符流
字符流 = 字节流 + 编码表
3、编码表
A:就是由字符和对应的数值组成的一张表
B:常见的编码表
ASCII
ISO-8859-1
GB2312
GBK
GB18030
UTF-8
C:字符串中的编码问题
编码
String -- byte[]
//通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
a:String(byte[] bytes)
//通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。
b:String(byte[] bytes, String charsetName)
解码
byte[] -- String
a:byte[] getBytes()
使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
b:byte[] getBytes(Charset charset)
使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组。
4、IO流中的编码问题(字节流转换为字符流)
A:OutputStreamWriter
a:OutputStreamWriter的构造方法:
OutputStreamWriter(OutputStream os):默认编码,GBK
OutputStreamWriter(OutputStream os,String charsetName):指定编码。
b:OutputStreamWriter的方法:
public void write(int c):写一个字符
public void write(char[] cbuf):写一个字符数组
public void write(char[] cbuf,int off,int len):写一个字符数组的一部分
public void write(String str):写一个字符串
public void write(String str,int off,int len):写一个字符串的一部分
c:面试题:close()和flush()的区别?
close()关闭流对象,但是先刷新一次缓冲区。关闭之后,流对象不可以继续再使用了。
flush()仅仅刷新缓冲区,刷新之后,流对象还可以继续使用。
B:InputStreamReader
a:InputStreamReader的构造方法:
InputStreamReader(InputStream is):默认编码,GBK
InputStreamReader(InputStream is,String charsetName):指定编码
b:InputStreamReader的方法:
int read():一次读取一个字符
int read(char[] chs):一次读取一个字符数组
C:编码问题其实很简单
编码只要一致即可
5、字符流
Reader
|--InputStreamReader
|--FileReader
|--BufferedReader
BufferedReader字符缓冲流的特殊方法:String readLine(); //一次读取一个字符串
Writer
|--OutputStreamWriter
|--FileWriter
|--BufferedWriter
BufferedReader字符缓冲流的特殊方法:void newLine(); //写一个换行符
void write(String line); //一次写一个字符串
6、复制文本文件(5种方式)
IO流小结(掌握)
IO流
|--字节流
|--字节输入流
InputStream
int read():一次读取一个字节
int read(byte[] bys):一次读取一个字节数组
|--FileInputStream
|--BufferedInputStream
|--字节输出流
OutputStream
void write(int by):一次写一个字节
void write(byte[] bys,int index,int len):一次写一个字节数组的一部分
|--FileOutputStream
|--BufferedOutputStream
|--字符流
|--字符输入流
Reader
int read():一次读取一个字符
int read(char[] chs):一次读取一个字符数组
|--InputStreamReader
|--FileReader
|--BufferedReader
String readLine():一次读取一个字符串
|--LineNumberReader
public int getLineNumber():获得当前行号
public void setLineNumber(int lineNumber)
|--字符输出流
Writer
void write(int ch):一次写一个字符
void write(char[] chs,int index,int len):一次写一个字符数组的一部分
|--OutputStreamWriter
|--FileWriter
|--BufferedWriter
void newLine():写一个换行符
void write(String line):一次写一个字符串

案例(理解 练习一遍)
A:复制文本文件 5种方式(掌握)
/*
* 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中(要求换行)
*
* 数据源:
* a.txt -- 读取数据 -- 字符转换流 -- InputStreamReader -- FileReader -- BufferedReader
* 目的地:
* b.txt -- 写出数据 -- 字符转换流 -- OutputStreamWriter -- FileWriter -- BufferedWriter
*/
public class CopyFileDemo2 {
public static void main(String[] args) throws IOException {
// 封装数据源
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
// 封装目的地
BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
// 读写数据
String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
// 释放资源
bw.close();
br.close();
}
}
B:复制图片(二进制流数据) 4种方式(掌握)
C:把集合中的数据存储到文本文件
D:把文本文件中的数据读取到集合并遍历集合
E:复制单级文件夹
F:复制单级文件夹中指定的文件并修改名称
回顾一下批量修改名称
G:复制多级文件夹
H:键盘录入学生信息按照总分从高到低存储到文本文件
I:把某个文件中的字符串排序后输出到另一个文本文件中
J:用Reader模拟BufferedReader的特有功能
K:模拟LineNumberReader的特有功能