标签:
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);
}
}
}
标签:
原文地址:http://www.cnblogs.com/ariesblogs/p/4218492.html