首页 > 代码库 > 【Java基础】IO流

【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);		}			}}

  

【Java基础】IO流