流本质上分为输入流与输出流,或字节流与字符流,而转换流与缓冲流本质上是功能流,转换流是为字符指定码表,缓冲流是为了加速。
转换流:
OutputStreamWriter:是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字节。它的作用的就是,将字符串按照指定的编码表转成字节,在使用字节流将这些字节写出去。
当我们需要指定码表的时候,需要用转换流,而不需要指定码表的时候,可以用他的直接子类,FileWriter.同时使用转换流,还需要配合FileOutputStream使用。
代码如下:
public class Demo02 { public static void main(String[] args) throws IOException { // 创建字节输出流对象,明确目的地 FileOutputStream fos=new FileOutputStream("D:\\io0803\\utf.txt",true); //创建转换流对象,明确码表 OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF-8"); //写出一个字符串 osw.write("我很好"); //释放资源 osw.close(); } }
InputStreamReader:
是字节流通向字符流的桥梁:它使用指定的字符编码表读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
代码:
public class Demo03 { public static void main(String[] args) throws IOException { // 明确字节输入流对象,明确目的地 FileInputStream fis = new FileInputStream("D:\\io0803\\utf8.txt"); // 创建转换流对象,指定编码表 InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); // 读取 int len = 0; while ((len = isr.read()) != -1) { System.out.println((char) len); } // 释放资源 isr.close(); } }
缓冲流:
代码:
public class Demo05 { public static void main(String[] args) throws IOException { //创建字符输入流,明确数据源 FileReader fr=new FileReader("D:\\io0803\\abc.png"); //创建缓冲字符流加速 BufferedReader br=new BufferedReader(fr); //创建字符输入流,明确目的地 FileWriter fw=new FileWriter("D:\\io0803\\a\\abc.png"); //创建缓冲字符输出流加速 BufferedWriter bw=new BufferedWriter(fw); //开始复制 int len=0; while((len=br.read())!=-1){ bw.write(len); } //释放资源 br.close(); bw.close(); } }
使用字符缓冲流完成文本文件的复制,用特有的方法一行一行的复制:
public class Demo07 { public static void main(String[] args) throws IOException { // 创建字节输入流,明确数据源 FileInputStream fis=new FileInputStream("D:\\io0803\\demo01.txt"); //创建转换流对象,指定码表 InputStreamReader isr=new InputStreamReader(fis,"UTF-8"); //创建字符缓冲流对象,加速 BufferedReader br=new BufferedReader (isr); //创建字节输出流。明确目的地 FileOutputStream fos=new FileOutputStream("D:\\io0803\\buffer3.txt"); //创建转换流对象,明确码表 OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF-8"); //加速 BufferedWriter bw=new BufferedWriter(osw); // String line=null; while((line=br.readLine())!=null){ //写一行 bw.write(line); //换行 bw.newLine(); //刷新流 bw.flush(); } //释放资源 br.close(); bw.close(); } }