【Java基础】IO流

package com.pachira.c;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

/*
 *                                               +----> [C] BufferedReader     ------> [C] LineNumberReader
 *                                               |----> [C] InputStreamReader  ------> [C] FileReader
 *                                               |----> [C] StringReader
 *                      +---> [C] Reader ------- +----> [C] PipedReader
 *                      |                        |----> [C] CharArrayReader
 *                      |                        +----> [C] FilterReader       ------> [C] PushbackReader
 *       +---> 字符流 -- +
 *       |              |                        +----> [C] BufferedWriter
 *       |              |                        |----> [C] OutputStreamWriter ------> [C] FileWriter
 *       |              |                        |----> [C] PrinterWriter
 *       |              +---> [C] Writer ------- +----> [C] StringWriter
 *       |                                       |----> [C] PipedWriter
 *       |                                       |----> [C] CharArrayWriter
 *       |                                       +----> [C] FilterWriter
 * IO -- +  
 *       |                                       +----> [C] FileInputStream     +----> [C] BufferedInputStream
 *       |                                       |----> [C] FilterInputStream --|----> [C] DataInputStream
 *       |                                       |----> [C] ObjectInputStream   +----> [C] PushbackInputStream
 *       |              +---> [C] InputStream -- +----> [C] PipedInputStream
 *       |              |                        |----> [C] SequenceInputStream
 *       |              |                        |----> [C] StringBufferInputStream
 *       |              |                        +----> [C] ByteArrayInputStream
 *       +---> 字节流 -- +   
 *                      |                        +----> [C] FileOutputStream    +----> [C] BufferedOutputStream
 *                      |                        |----> [C] FilterOutputStream--|----> [C] DataOutputStream
 *                      +---> [C] OutputStream - +----> [C] ObjectOutputStream  +----> [C] PrintStream
 *                                               |----> [C] PipedOutputStream
 *                                               +----> [C] ByteArrayOutputStream
 *   
 *   
 *IO流的分类
 *1).数据类型:字符流和字节流
 *2).数据流向:输入流和输出流
 *
 *字符流和字节流
 *1).字符流的由来:因为数据编码的不同,而有了对字符进行高效操作的流对象。本质其实就是基于字节流读取时,去查了指定的码表。
 *2).字节流和字符流的区别:
 *    读写单位不同:字节流以字节(8bit)为单位,字符流以字符为单位,根据码表映射字符,一次可能读多个字节。
 *    处理对象不同:字节流能处理所有类型的数据(如图片、音频等),而字符流只能处理字符类型的数据。
 *结论:只要是处理纯文本数据,就优先考虑使用字符流, 除此之外都使用字节流。
 *
 *输入流和输出流
 *对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。 
 *
 *InputStream
 *1).InputStream是所有的输入字节流的父类,它是一个抽象类;
 *2).ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别从Byte数组、StringBuffer、本地文件中读取数据;
 *3).PipedInputStream是从与其它线程共用的管道中读取数据;
 *4).ObjectInputStream和所有FilterInputStream的子类都是装饰流(装饰器模式的主角);
 *
 *OutputStream
 *1).OutputStream是所有的输出字节流的父类,它是一个抽象类;
 *2).ByteArrayOutputStream、FileOutputStream 是两种基本的介质流,它们分别向Byte 数组、本地文件中写入数据;
 *3).PipedOutputStream是向与其它线程共用的管道中写入数据;
 *4).ObjectOutputStream 和所有FilterOutputStream 的子类都是装饰流;
 *
 *Reader
 *1).Reader是所有的输入字符流的父类,它是一个抽象类;
 *2).CharReader、StringReader是两种基本的介质流,它们分别将Char数组、String中读取数据;
 *3).PipedReader是从与其它线程共用的管道中读取数据;
 *4).BufferedReader很明显就是一个装饰器,它和其子类负责装饰其它Reader对象;
 *5).FilterReader是所有自定义具体装饰流的父类,其子类PushbackReader对Reader对象进行装饰,会增加一个行号;
 *6).InputStreamReader是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader可以说是一个达到此功能、常用的工具类,
 *   在其源代码中明显使用了将FileInputStream转变为Reader的方法;
 *
 *Writer
 *1).Writer是所有的输出字符流的父类,它是一个抽象类;
 *2).CharArrayWriter、StringWriter是两种基本的介质流,它们分别向Char数组、String中写入数据;
 *3).PipedWriter是向与其它线程共用的管道中写入数据;
 *4).BufferedWriter是一个装饰器为Writer提供缓冲功能;
 *5).PrintWriter和PrintStream极其类似,功能和使用也非常相似;
 *6).OutputStreamWriter是OutputStream到Writer转换的桥梁,它的子类FileWriter 其实就是一个实现此功能的具体类;
 *
 */
public class IO {
	public static void main(String[] args) throws IOException {
		//字符流
		String path = "data/data";
		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(path),"utf-8"));
		String line = "";
		while((line = br.readLine()) != null){
			System.out.println(line);
		}
		br.close();
		/*字节流
		 * UTF-8:是一种变长的编码方式,它可以使用1~4个字节表示一个符号;
		 * GBK:A character is encoded as 1 or 2 bytes
		 */
		path = "data/data2";
		FileInputStream fis = new FileInputStream(path);
		byte[] bs = new byte[2];
		while(fis.available() > 0){
			fis.read(bs);
			String tmp = new String(bs, "gbk");
			for(byte b:bs){
				System.out.print(b+" ");
			}
			System.out.println(tmp + " ");
			bs = new byte[2];
		}
		fis.close();
		/*
		 * 常用工具
		 * this((ReadableByteChannel)(new FileInputStream(source).getChannel()), charsetName);
		 */
		Scanner sc = new Scanner(new File(path), "gbk");
		while(sc.hasNext()){
			String tline = sc.nextLine();
			System.out.println(tline);
		}
		
	}
}

  

posted on 2015-01-12 15:28  有个姑娘叫小芳  阅读(166)  评论(0编辑  收藏  举报