Java IO流中提供了两种用于将字节流转换为字符流的转换流——InputStreamReader和OutputStreamWriter。

        其中,InputStreamReader用于将字节输入流转换为字符输入流,OutputStreamWriter用于将字节输出流转换为字符输出流。

使用转换流可以在一定程度上避免乱码,还可以在使用时制定编码格式(比如UTF-8、GBK、GB2312、ISO8859-1等)

一、InputStreamReader

        InputStreamReader是Reader的子类,可以将InputStream(字节流)转换成Reader(字符流)。

构造方法:

InputStreamReader(InputStream in); //创建一个使用默认字符集的InputStreamReader。 
InputStreamReader(InputStream in, Charset cs) ;//创建一个使用给定字符集的InputStreamReader。
InputStreamReader(InputStream in, CharsetDecoder dec) ;//创建一个使用给定字符集解码器的InputStreamReader。  
InputStreamReader(InputStream in, String charsetName) ;//创建一个使用命名字符集的InputStreamReader。

常用方法:

void close() ;//关闭流并释放与之相关联的任何系统资源。  
String getEncoding() ;//返回此流使用的字符编码的名称。  
int read() ;//读一个字符。
int read(char[] cbuf, int offset, int length) ;//将字符读入数组的一部分。  
boolean ready() ;//告诉这个流是否准备好被读取。

示例代码:

public static void transReadNoBuf() throws IOException {
		/**
		 * 没有缓冲区,只能使用read()方法。
		 */
		//读取字节流
//		InputStream in = System.in;//读取键盘的输入。
		InputStream in = new FileInputStream("D:\\demo.txt");//读取文件的数据。
		//将字节流向字符流的转换。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节.
		InputStreamReader isr = new InputStreamReader(in);//读取
//		InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\demo.txt"));//综合到一句。
			
		char []cha = new char[1024];
		int len = isr.read(cha);
		System.out.println(new String(cha,0,len));
		isr.close();
 
	}
	public static void transReadByBuf() throws IOException {
		/**
		 * 使用缓冲区 可以使用缓冲区对象的 read() 和  readLine()方法。
		 */
		//读取字节流
//		InputStream in = System.in;//读取键盘上的数据
		InputStream in = new FileInputStream("D:\\demo.txt");//读取文件上的数据。
		//将字节流向字符流的转换。
		InputStreamReader isr = new InputStreamReader(in);//读取
		//创建字符流缓冲区
		BufferedReader bufr = new BufferedReader(isr);//缓冲
//		BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileInputStream("D:\\demo.txt")));可以综合到一句。
	/*	int ch =0;
		ch = bufr.read();
		System.out.println((char)ch);*/
		String line = null;
		while((line = bufr.readLine())!=null){
			System.out.println(line);
		}
		isr.close();
	}

二、OutputStreamWriter

        OutputStreamWriter是Writer的子类,可以将OutputStream(字节流)转换成Writer(字符流)。

构造方法:

OutputStreamWriter(OutputStream out) ;//创建一个使用默认字符编码的OutputStreamWriter。  
OutputStreamWriter(OutputStream out, Charset cs) ;//创建一个使用给定字符集的OutputStreamWriter。  
OutputStreamWriter(OutputStream out, CharsetEncoder enc) ;//创建一个使用给定字符集编码器的OutputStreamWriter。  
OutputStreamWriter(OutputStream out, String charsetName) ;//创建一个使用命名字符集的OutputStreamWriter。

常用方法:

void close() ;//关闭流,先刷新。  
void flush() ;//刷新流。  
String getEncoding() ;//返回此流使用的字符编码的名称。  
void write(char[] cbuf, int off, int len) ;//写入字符数组的一部分。  
void write(int c) ;//写一个字符。
void write(String str, int off, int len) ;//写一个字符串的一部分。

示例代码:

public static void transWriteNoBuf() throws IOException {
		OutputStream out = System.out;//打印到控制台
//		OutputStream out = new FileOutputStream("D:\\demo.txt");//打印到文件
		OutputStreamWriter osr = new OutputStreamWriter(out);//输出
//		OutputStreamWriter osr = new OutputStreamWriter(new FileOutputStream("D:\\demo.txt"));//两句可以综合到一句。
//		int ch = 97;//a
//		int ch = 20320;//你
//		osr.write(ch);
		String str = "你好吗?";//你好吗?
		osr.write(str);
		osr.flush();
		osr.close();
	}
	public static void transWriteByBuf() throws IOException {
//		OutputStream out = System.out;//打印到控制台。
		OutputStream out = new FileOutputStream("D:\\demo.txt");//打印到文件。
		OutputStreamWriter osr = new OutputStreamWriter(out);//输出
//		OutputStreamWriter osr = new OutputStreamWriter(new FileOutputStream("D:\\demo.txt"));//综合到一句。
		BufferedWriter bufw = new BufferedWriter(osr);//缓冲
//		int ch = 97;//a
//		int ch = 20320;//你
//		osr.write(ch);
		String str = "你好吗?\r\n我很好!";//你好吗?
		bufw.write(str);
		bufw.flush();
		bufw.close();
	}