1 转换流
1.1 OutputStreamWriter
1)介绍
OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节。
它的作用的就是,将字符串按照指定的编码表转成字节,再使用字节流将这些字节写出去。
2)示例
// 1 创建与文件关联的字节输出流对象
FileOutputStream fos = new FileOutputStream("/Users/Mac/mydata/ioouttest.txt");
// 2 创建可以把字符转成字节的转换流对象,并指定编码
OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8");
// 3 调用转换流,把文字写出去,其实是写到转换流的缓冲区中
osw.write("你好");// 写入缓冲区。
// 4 刷新并关闭流
osw.close();
1.2 InputStreamReader
1)介绍
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的字符编码表读取字节并将其解码为字符。
它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
2)示例
// 1 创建读取文件的字节流对象
InputStream in = new FileInputStream("/Users/Mac/mydata/ioouttest.txt");
// 2 创建转换流对象
InputStreamReader isr = new InputStreamReader(in, "utf-8");
// 3 使用转换流去读字节流中的字节
int ch = 0;
while ((ch = isr.read()) != -1) {
System.out.println((char) ch);
}
// 关闭流
isr.close();
注意:在读取指定的编码的文件时,一定要指定编码格式,否则就会发生解码错误,而发生乱码现象。
1.3 转换流和子类的区别
OutputStreamWriter –> FileWriter
InputStreamWriter –> FileReader
当操作的字符文件,使用的是默认编码表时可以不用父类,直接用子类就能完成操作,简化了代码。
一旦要指定其他编码时,绝对不能用子类,必须使用字符转换流。
2 缓冲流
2.1 字节缓冲流
1)字节缓冲输出流 BufferedOutputStream
// 1 创建字节输出流
FileOutputStream fos=new FileOutputStream("/Users/Mac/mydata/ioouttest.txt");
// 使用缓冲流封装
BufferedOutputStream bos=new BufferedOutputStream(fos);
// 2 写数据
bos.write("hello world\n".getBytes());
// 3 关闭流
bos.close();
2)字节缓冲输入流 BufferedInputStream
// 1 创建字节输入流
FileInputStream fis=new FileInputStream("/Users/Mac/mydata/ioouttest.txt");
// 2 包装基本流
BufferedInputStream bis=new BufferedInputStream(fis);
// 3 读数据
int ch=-1;
while((ch=bis.read())!=-1) {
System.out.println((char)ch);
}
// 4 关闭流
bis.close();
2.2 字符缓冲流
1)字符缓冲输出流 BufferedWriter
// 1 创建流
FileWriter fw = new FileWriter("/Users/Mac/mydata/ioouttest.txt");
BufferedWriter bw = new BufferedWriter(fw);
// 2 写数据
for (int i = 0; i < 5; i++) {
bw.write("hello hello");
bw.newLine();
}
// 3 关闭流
bw.close();
2)字符缓冲输入流 BufferedReader
// 1 创建流
BufferedReader br=new BufferedReader(new FileReader("/Users/Mac/mydata/ioouttest.txt"));
// 2 读数据
String line=null;
while((line=br.readLine())!=null) {
System.out.println(line);
}
// 3 关闭流
br.close();
2.3 使用字符缓冲流完成文本文件复制
// 1 指定数据源和目的文件
BufferedReader br=new BufferedReader(new FileReader("/Users/Mac/mydata/ioouttest.txt"));
BufferedWriter bw=new BufferedWriter(new FileWriter("/Users/Mac/mydata/ioouttest_copy2.txt"));
// 2 读数据与写数据
String line=null;
while ((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();
}
// 3 关闭流
bw.close();
br.close();
3 流的操作规律
1)操作数据的类型
- InputStream –> 字节
- Reader –> 文本
2)数据所在位置
- 硬盘 –> Filexxx
- 内存 –> 数组,字符串
- 键盘 –> System.in
- 网络 –> Socket
3)是否需要额外功能
- 转换 –> InputStreamReader OutputStreamWriter
- 高效 –> Bufferedxxx