学习目标


 掌握OutputStreamWriter和InputStreamReader类的作用

具体学习内容:


OutputStreamWriter和InputStreamReader


在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类。


OutputStreamWriter:是Writer的子类,将输出的字符流变为字节流,即:将一个字符流的输出对象变为字节流的输出对象。


InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即:将一个字节流的输入对象变为字符流的输入对象。


一般在操作输入输出内容的时候就需要使用字节或字符流,但是有些时候需要将字符流变为字节流的形式,或者将字节流变为字符流的形式,所以,就需要另外一组转换流的操作类。


转换步骤:


如果以文件操作为例,则在内存中的字符数据需要通过OutputStreamWriter变为字节流才能保存在文件之中,读取的时候需要将读入的字节流通过InputStreamReader变为字符流


java 字节流转字符串 指定编码格式_字符流


在OutputStreamWriter类中需要一个字节流的对象:public OutputStreamWriter(OutputStream


例如:将字节的文件输出流,以字符的形式输出。代码如下:


import java.io.* ;
public class OutputStreamWriterDemo01{
	public static void main(String args[]) throws Exception	{	// 所有异常抛出
		File f = new File("d:" + File.separator + "test.txt") ;	
		Writer out = null ;	// 字符输出流
		out = new OutputStreamWriter(new FileOutputStream(f)) ;	// 字节流变为字符流
		out.write("hello world!!") ;	// 使用字符流输出
		out.close() ;
	}
};

读的时候,也可以使用字符流的形式读取字节流的文件。程序代码如下:


import java.io.* ;
public class InputStreamReaderDemo01{
	public static void main(String args[]) throws Exception{
		File f = new File("d:" + File.separator + "test.txt") ;	
		Reader reader = null ;
		reader = new InputStreamReader(new FileInputStream(f)) ;	// 将字节流变为字符流
		char c[] = new char[1024] ;
		int len = reader.read(c) ;	// 读取
		reader.close() ;	// 关闭
		System.out.println(new String(c,0,len)) ;
	}
};

但是以上都是以文件操作为例,因为OutputStreamWriter()中的接收类型是OutputStream,只要是字节输出流都可以使用字符的形式操作,而InputStreamReader()中接收的是InputStream,只要是字节的输出流都可以使用字符的输入流操作。




FileWriter和FileReader的说明


从JDK文档中可以知道FileOutputStream是OutputStream的直接子类,FileInputStream也是InputStream的直接子类,但是在字符流文件的两个操作类却有一些特殊,FileWriter并不直接是Writer的子类,而是OutputStreamWriter的子类,而FileReader也不直接是Reader的子类,而是InputStreamReader的子类,那么从这两个类的继承关系就可以清楚的发现,不管是是使用字节流还是字符流实际上最终都是以字节形式操作输出流的。


java 字节流转字符串 指定编码格式_子类_02


FileWriter不是Writer的子类,而是转换流的子类。


java 字节流转字符串 指定编码格式_java 字节流转字符串 指定编码格式_03


FileReader也不是Reader的子类,而是转换流的子类。


也就是说,最后不管如何,虽然是以字符的输出流形式操作了字节的输出流,但实际上还是以字节的形式输出,而字符的输入流,虽然以字符的形式操作,但实际上还是使用的字节流,也就是说,传输或者是从文件中读取数据的时候,文件中真正保存的数据永远是字节。




总结:


1、一定要掌握两个转换类的作用。


2、重点:操作的终端点实际上都是以字节的形式进行的。


3、FileWriter和FileReader两个子类的定义,其实是中间使用了转换类。