IO流 包装流和编码解码流程图

0 编码解码的顺序和如何甄别:



 

1 总结大纲:

处理流:增强功能、提供性能,节点流之上
一、缓冲流
1)、字节缓冲流
BufferedInputStream
	InputStream is =new BufferedInputStream(new FileInputStream(src));
BufferedOutputStream
	OutputStream os =new BufferedOutputStream( new FileOutputStream(dest));
2)、字符缓冲流
BufferedReader   readLine() 
	BufferedReader reader =new BufferedReader(new FileReader(new File(src)));
BufferedWriter    newLine() 
	BufferedWriter wr =new BufferedWriter(new FileWriter(new File(dest)));

二、转换流: 字节流 转为字符流   处理乱码(编码集、解码集)
1、编码与解码概念  以程序为中心
 编码:  字符   ---编码字符集>二进制
 解码 : 二进制   --解码字符集->      字符

 数字 ----- >字符   (解码 以人为主体,解释给人看得懂)
 字符 ----->  数字 (编码,人为主题,把人类世界符号编程到计算机世界中)
2、乱码:
1)编码与解码的字符集不统一
2)字节缺少,长度丢失
3、文件乱码 
InputStreamReader(字节输入流,"解码集")
OutputStreamWriter(字符输出流,"编码集")

2 代码:

2.1 字节包装流实现拷贝:

/**
 * 字节流文件拷贝+缓冲流 ,提高性能
 * 缓冲流(节点流)
 * @author Administrator
 *
 */
public class BufferedByteDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
	}
	/**
	 * 文件的拷贝
	 * @param  源文件路径
	 * @param  目录文件路径
	 * @throws FileNotFoundException,IOException
	 * @return 
	 */
		public static void copyFile(String srcPath,String destPath) throws FileNotFoundException,IOException {
			//1、建立联系 源(存在且为文件) +目的地(文件可以不存在)  
			File src =new File(srcPath);
			File dest =new File(destPath);
			if(! src.isFile()){ //不是文件或者为null
				System.out.println("只能拷贝文件");
				throw new IOException("只能拷贝文件");
			}
			//2、选择流
			InputStream is =new BufferedInputStream(new FileInputStream(src));
			OutputStream os =new BufferedOutputStream( new FileOutputStream(dest));
			//3、文件拷贝   循环+读取+写出
			byte[] flush =new byte[1024];
			int len =0;
			//读取
			while(-1!=(len=is.read(flush))){
				//写出
				os.write(flush, 0, len);
			}
			os.flush(); //强制刷出
			
			//关闭流
			os.close();
			is.close();
		}

}

2.2 字符包装流实现拷贝:

/**
 * 字符缓冲流 +新增方法(不能发生多态) 
 * @author Administrator
 *
 */
public class BufferedCharDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//创建源 仅限于 字符的纯文本
		File src =new File("E:/xp/test/Demo03.java");
		File dest =new File("e:/xp/test/char.txt");
		//选择流
		BufferedReader reader =null;		
		BufferedWriter wr =null;
		try {
			reader =new BufferedReader(new FileReader(src));
			wr =new BufferedWriter(new FileWriter(dest));
			//读取操作
			/*
			char[] flush =new char[1024];
			int len =0;
			while(-1!=(len=reader.read(flush))){
				wr.write(flush, 0, len);
			}*/
			//新增方法的操作
			String line =null;
			while(null!=(line=reader.readLine())){
				wr.write(line);
			//wr.append("\r\n");
				wr.newLine(); //换行符号
			}
			wr.flush();//强制刷出
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			System.out.println("源文件不存在");
		} catch (IOException e) {
			e.printStackTrace();
			System.out.println("文件读取失败");
		}finally{
			try {
				if (null != wr) {
					wr.close();
				}
			} catch (Exception e2) {
			}
			try {
				if (null != reader) {
					reader.close();
				}
			} catch (Exception e2) {
			}
		}
	}

}

2.3  包装流的终极文件拷贝,(此写法只能拷贝文本文件,对于图片 声音 视频等不适用 ) ,注意体会代码的注释

体会 File类被一层层包裹的目的,  以及类   InputStreamReader  BufferedWriter  BufferedReader的遍历方法

readLine  writeLine的使用

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/**
 * 转换流: 字节转为字符
 * 1、输出流 OutputStreamWriter 编码 (把人看得懂的字符写到计算机中  给这些字符编数字  编码)
 * 2、输入流 InputStreamReader  解码(存储在计算中中的文件是二进制的,要把二进制的数字变成人类读的懂的字符 解释给人看 解码)
 * 
 * 确保源不能为乱码
 * @author Administrator
 *
 */
public class ConverDemo02 {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		//指定解码字符集
		BufferedReader br =new BufferedReader( // 只有这个类才能字符、数组和行的高效读取
				new InputStreamReader( // InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符, 是FileReader的父类,也只有InputStreamReader 才能指定字符集,InputStream-->Reader = InputStreamReader 
					new BufferedInputStream(
							new FileInputStream(  
									new File("E:/xp/test/Demo03.java"))),"UTF-8")    -- 从       BufferedInputStream( FileInputStream(file) )  
				);
		//写出文件 编码
		BufferedWriter bw =new BufferedWriter(
				new OutputStreamWriter(
					new BufferedOutputStream(	
					new FileOutputStream(new File("E:/xp/test/encode.java")))));
				
		String info =null;
		while(null!=(info=br.readLine())){
			//System.out.println(info);
			bw.write(info);
			bw.newLine();
		}
		bw.flush();
		bw.close();
		br.close();
	}

}

猜你喜欢

转载自chengjianxiaoxue.iteye.com/blog/2400670