------- <a href="http://www.itheima.com"target="blank">android培训</a>、<a href="http://www.itheima.com"target="blank">java培训</a>、期待与您交流! ----------
情形1
InputStreamReader是字节流通向字符流的桥梁,OutputStreamReader是字符流通向字节流的桥梁,InputStreamReader是Reader的子类,OutputStreamReaderWriter的子类故两个本身是都属于字符流,直接子类是FileReader和FileWriter.
举例:
功能需求:键盘录入一行数据并打印其大写。
分析:实现键盘录入一行数据最方便简捷的是readLine()方法,但其属于字符流缓冲区BufferedReader类中的,那么我们就可以使用InputStreamReader将字节流转换成字符流,再使用字符流缓冲区中的readLine()方法实现读取一行打印一行.
另外,打印过程也借助字符流缓冲区技术BufferedWriter提高效率,那么就用到OutputStreamWriter将要接收并打印的数据存入输出流缓冲区,调用其write()方法输出。
代码如下:
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//获取键盘 录入对象
//InputStream in =System.in;
//使用转换流,将字节流转换成字符流对象
//InputStreamReader isr = new InputStreamReader(in);
//将字符流对象传入缓冲区,提高效率
//BufferedReader bufr = new BufferedReader(isr);
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));//读取键盘录入
//同理
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
String line = null;//相当于一个中转站
while((line=bufr.readLine())!=null)//缓冲区中的数据一行行读取,一行行打印
{ if("over".equals(line))
break;
//System.out.println(line.toUpperCase());
bufw.write(line.toUpperCase());
bufw.newLine();//写入一个行分隔符,也就是下次从缓冲区读取一行并写入时换行
//bufw.flush();//务必!!写一行刷新一行,才能显示出来
}
bufr.close();
bufw.close();
}
情形2
举例:
功能需求:把录入数据按照指定的编码表(utf-8),将数据存到文件中。
分析:要存储到硬盘中的一个文件中,用FileWriter, FileWriter使用的是默认的编码表(GBK).但本需求是需要加入指定编码表utf-8,指定编码表只有转换流可以操作。
所以这里要使用的对象是写入转换流OutputStreamWriter。
如:OutputStreamWriter osw=new OutputStreamWriter(FileOutputStream(“a.txt”),”utf-8”);
(同理,读取指定编码表utf-8文件时,需要读取转换流InputStreamReaderosr=
new InputStreamReader (FileInputStream(“b.txt”),”utf-8”);)
总结:转换流是字符与字节之间的桥梁,通常涉及到字符编码转换时就需要用到转流。