Java_io体系之OutputStreamWriter、InputStreamReader简介、走进源码及示例――17(二)

2014-11-24 07:53:52 · 作者: · 浏览: 1
(str, off, len); } /** * flush此流、实际上是调用StreamEncoder的flush方法、 */ public void flush() throws IOException { se.flush(); } /** * 关闭StreamEncoder、即关闭OutputSteramWriter. */ public void close() throws IOException { se.close(); } }

4、实例演示:



package com.chy.io.test;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class OutputStreamWriterTest {
	
	private final static String str = "威尔杰克逊";
	
	
	public static void testOutputStreamWriterTest()throws IOException{
		File file = new File("D:" + File.separator + "osw.txt");
		//设置文件内容可追加
		FileOutputStream fos = new FileOutputStream(file, true);
		
		OutputStreamWriter oswDefault = new OutputStreamWriter(fos);
		BufferedWriter bwDefault = new BufferedWriter(oswDefault);
		//第一个“威尔杰克逊”
		bwDefault.write(str);
		bwDefault.newLine();
		System.out.println("oswDefault encoding: " + oswDefault.getEncoding());
		
		
		OutputStreamWriter oswGBK = new OutputStreamWriter(fos, "GBK");
		BufferedWriter bwGBK = new BufferedWriter(oswGBK);
		//第二个“威尔杰克逊”
		bwGBK.write(str);
		bwGBK.newLine();
		System.out.println("bwGBK encoding: " + oswGBK.getEncoding());
		
		
		OutputStreamWriter oswUTF8 = new OutputStreamWriter(fos, "UTF-8");
		BufferedWriter bwUTF8 = new BufferedWriter(oswUTF8);
		//第三个“威尔杰克逊”
		bwUTF8.write(str);
		bwUTF8.newLine();
		System.out.println("bwGBK encoding: " + oswUTF8.getEncoding());
		
		/**关闭流、释放资源
		 * 自己可以尝试分析为什么不能写成下面这种形式?
		 * 
		bwDefault.flush();
		bwDefault.close();
		
		bwGBK.flush();
		bwGBK.close();
		
		bwUTF8.flush();
		bwUTF8.close();
		
		fos.flush();
		fos.close();
		*/
		
		/**关闭流、释放资源*/
		bwDefault.flush();
		bwGBK.flush();
		bwUTF8.flush();
		
		bwDefault.close();
		bwGBK.close();
		bwUTF8.close();
	}
	
	public static void main(String[] args) throws IOException{
		testOutputStreamWriterTest();
	}
}


二:InputStreamReader


1、类功能简介:


输出字符转换流、是输出字节流通向输出字符流的桥梁、用于将字节输出流转换成字符输出流、也就是完成将要写入的字符使用特定的编码转码成字节、再将转换后的字节写入到底层字节输出流中。可以指定编码。本质是OutputStreamWriter内部的一个类:StreamEncoder、这个类来完成上面所有的工作、是这个类使用指定的或者默认的编码来将要写入的字符转码成字节、然后调用StreamEncoder的方法来将转码后的字节写入到底层流中OutputStreamWriter中所有的方法都是调用StreamEncoder来实现的、OutputStreamWriter只是对StreamEncoder进行了封装、什么都没有做、


2、InputStreamReader API简介:


A:关键字


	private final StreamDecoder sd;		核心类、用于将字节解码成字符

B:构造方法


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


C:一般方法


	String getEncoding()	返回此流使用的字符编码的名称。
	
	int read()	 读取单个字符。
	
	int read(char cbuf[], int offset, int length)	将字符读入数组中的某一部分。
	
	boolean ready()		判断此流是否已经准备好用于读取。
	
	void close()	关闭该流并释放与之关联的所有资源。


3、源码分析


package com.chy.io.original.code;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;



/**
 * 字符输入流、是连接字节流与字符流之间的桥梁。将读取的字节转换成字符、编码可以使用系统默认的也可以使用指定的。
 * 为提