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