Java IO 03 转换流 & 缓冲流

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

猜你喜欢

转载自blog.csdn.net/lihaogn/article/details/81155016