一般来说,java I/O总共有16个流需要我们熟练掌握。接下来从I/O继承关系、流的分类、选择不同流应遵循的原则三个方面对 java I/O进行梳理。
1、流的分类
按照对数据的读写方式不同可以将流分为字节流和字符流,字节流每次读写都是以字节为单位,而字符流则是按编码字符为单位对多个字节进行字符编码然后返回字符。
按照流的指向可将流分为输入流和输出流,输入流是指将数据读到内存,输出流则是指将内存中的数据写到磁盘。
除了分为字节流/字符流、输入流/输出流,还可以按实现的功能分为节点流和处理流,
节点流:直接对数据源进行读写
处理流:对已经存在的流进行连接和封装,其构造方法必须要带一个其他流作为参数。处理流又包含5个类型:缓冲流、转换流、数据流、打印流和对象流。
2、流的继承体系:
3、选择流应遵循的规则
(1)目的:写入or读取?
写入:OutputStream/Writer
读取:InputStream/Reader
(2)是否操纵存文本?
是:优先选择字符流,Reader/Writer
否:只能选择字节流,Stream
(3)是否需要使用缓冲?
BufferedInputStream/BufferedOutputStream、BufferedReader/BufferedWriter
4、常用流的使用举例
通常使用流有四个步骤:
创建文件对象——>创建流——>使用流进行读写——>关闭流
(1)文件输入/输出流:
字节流:FileInputStream/FileOutputStream
BufferedInputStream/BufferedOutputStream
字符流:FileReader/FileWriter
BufferedReader/BufferedWriter
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.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
/**
* @author liwenkai
*
* 2016年11月28日
*/
public class BufferReaderAndWriterExample {
/**
* 1、FileInputStream类:
* 常用方法:int read():读取单个字节,返回该符号的ASCⅡ码
* int read(byte []byt):将此输入流中最多byt.length个字节读取到数组byt中,返回读入的总字节数
* int read(byte []byt,int off,int len):将此输入流中从偏移量off开始,最多len个字节读取到数组byt中,
* 返回读入的总字节数
* @param inFileName 要读取的文件位置
*/
public void fileInputStream(String inFileName){
//首先生成文件对象
File file = new File(inFileName);
try {
//创建输入流对象
FileInputStream in = new FileInputStream(file);
//创建byte数组。将文件中读取的信息放到数组中
byte []byt = new byte[100];
int len = in.read(byt);//返回写入到数组中的总字节数
// int x = in.read(); //无参的read方法返回的是该字符所对应ASCⅡ码,例如,若读到'a',则返回97
System.out.println(len);
//System.out.println("文件中的信息是:" + new String(byt,0,len));
in.close();
} catch (Exception e