简单来说,由于方法的局限性和功能的需要,特此产生了转换流。
InputStreamReader是字节流转换字符流的桥梁,为了提高效率,可以在缓冲区中放入转化流的对象,,并且构造函数第二个参数可以传入一个指定字符编码
读入键盘录入并打印控制台:
InputStream is = System.in; BufferedReader bufr = null; InputStreamReader inr = null; try { inr = new InputStreamReader(is,"UTF-8"); bufr = new BufferedReader(inr); String str = null; char []ch = new char[1024]; while((str = bufr.readLine())!=null) { System.out.println(str.toUpperCase()); } }catch(IOException e) { e.printStackTrace(); }catch(Exception e) { e.printStackTrace(); }finally { try { if(bufr!=null)bufr.close(); if(inr!=null)inr.close(); }catch(IOException e) { e.printStackTrace(); } }
效果如图
OutPutStreamWriter是字符流通向字节流的桥梁:第二个参数同样可以指定一个字符编码
FileOutputStream fos = null; OutputStreamWriter otw = null; BufferedWriter bufw = null; try { fos = new FileOutputStream("D:\xiaofei1.txt"); otw = new OutputStreamWriter(fos,"UTF-8"); bufw = new BufferedWriter(otw); bufw.write("我爱中国"); bufw.flush(); bufw.write("我是中国人"); }catch(IOException e) { e.printStackTrace(); }catch(Exception e) { e.printStackTrace(); }finally { try { if(bufw!=null)bufw.close(); }catch(IOException e) { e.printStackTrace(); } }
转换流可以指定字符编码,只有BufferedReader的ReaderLine()方法读到末尾的返回值是null,别的read()方法都是读到末尾返回-1,具体用哪个看后缀
流操作的规律:
- 明确源和目的
- 源:输入流 InputStream Reader
- 目的:输出流 OutputStream Writer
- 操作的数据是否是纯文本
- 是:字符流
- 不是:字节流
2.明确体系后要明确具体的使用的对象
- 源设备:内存 硬盘 键盘
- 目的设备:内存 硬盘 控制台
实例:将一个文本文件数据存储到另一个文件中:复制文件
明确体系:
源:文件---读取流------inputStream和Reader
是否是纯文本:是------Reader
目的:文件---写入流-------OutputOutputStream和Writer
是否是纯文本:是:writer
明确设备:
源:Reader
设备:硬盘上一个文件---子类对象:FileReader
FileReader fr = new FileReader("D:xiaofei.txt");
是否要提高效率:是-------加入Reader中的缓冲区:BufferedReader
BufferedReader br = new BufferedReader(fr);
目的:硬盘上的一个文件:子类对象:FileWriter
FileWriter fw = new FileWriter("D:\xiaofei1.txt");
是否要提高效率:是--------加入Writer缓冲区BufferedWriter
BufferedWriter bufw = new BufferedWriter(fw);
----------看《毕向东java》笔记