IO流分为六种概念:输入流、输出流、字节流、字符流、节点流和处理流。
可以方便地实现数据的输入/输出操作。
不同的输入/输出源(键盘、文件、网络连接等)抽象表述 为“流”(stream)。
一、 流的分类
- 输入流:只能从中读取数据,而不能向其写入数据。由InputStream和 Reader作为基类。
- 输出流:只能向其写入数据,而不能从中读取数据。由OutputStream和Writer作为基类。
- 字节流:操作的数据单元是8位的字节,由InputStream和OutputStream作为基类。
- 字符流:操作的数据单元是16位的字符,由 Reader和 Writer作为基类。
- 节点流:可以从向一个特定的IO设备(如磁盘、网络)读/写数据的流。也被称为低级流。
- 处理流:用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读/写功能。也称为高级流。
二、 抽象基类
Java的IO流共涉及40多个类,都是从InputStream(字节输入流)、Reader(字符输入流)、OutputStream(字节输出流)、Writer(字符输出流)4个抽象基类派生的。
IO流的类图表:
分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
---|---|---|---|---|
抽象基类 | InputStream | OutputStream | Reader | Writer |
访问文件 | FilelnputStream | FileOutputStream | FileReader | FileWriter |
访问数组 | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | CharArrayWriter |
访问管道 | PipedlnputStream | PipedOutputStream | PipedReader | PipedWriter |
访问字符串 | StringReader | StringWriter | ||
缓冲流 | BufferedInputStream | BufferedOutputStream | BufferedReader | BufferesWriter |
转换流 | InputStreamReader | OutputStreamWriter | ||
对象流 | ObjectInputStream | ObjectOutputStream | ||
抽象基类 | FilterInputStream | FilterOutputStream | FilterReader | FilterWriter |
打印流 | PrintStream | PrintWriter | ||
推回输入流 | PushbackInputStream | PushbackReader | ||
特殊流 | DataInputStream | DataOutputStream |
IO流的类图:
三、输入流
只能从中读取数据,而不能向其写入数据。
InputStream和Reader是所有输入流的基类。
InputStream和Reader的方法基本一致,只是InputStream读取的是字节,使用的参数是byte数组(byte[ ]),而Reader读取的是字符,使用的参数是char数组(char[ ])。
InputStream和Reader都是抽象类,本身不能创建实例,但它们分别有一个用于读取文件的输入流:FileInputStream和FileReader,它们都是节点流需要直接和指定文件关联。
1. InputStream的方法
int available():返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。
void close():关闭此输入流并释放与该流关联的所有系统资源。
void mark(int readlimit):在此输入流中标记当前的位置。
boolean markSupported():测试此输入流是否支持mark和reset方法。
abstract read():从输入流中读取数据的下一个字节。
int read(byte[] b):从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中。
int read(byte[] b,int off,int len):将输入流中最多len个数据字节读入byte数组。
void reset():将此流重新定位到最后一次对此输入流调用mark方法时的位置。
long skip(long n):跳过和丢弃此输入流中数据的n个字节。
例:
2. Reader的方法
abstract void close():关闭该流并释放与之关联的所有资源。
void mark(int readAheadLimit):标记流中的当前位置。
boolean markSupported():判断此流是否支持 mark() 操作。
int read():读取单个字符。
int read(char[] cbuf):将字符读入数组。
bstract int read(char[] cbuf,int off,int len):将字符读入数组的某一部分。
int read(CharBuffer target):试图将字符读入指定的字符缓冲区。
boolean ready():判断是否准备读取此流。
void reset():重置该流。
long skip(long n):跳过字符。
例:
四、输出流
只能向其写入数据,而不能从中读取数据。
OutputStream和Write是所有输出流的基类。
1. OutputStream的方法
void close():关闭此输出流并释放与此流有关的所有系统资源。
void flush():刷新此输出流并强制写出所有缓冲的输出字节。
void write(byte[] b):将b.length个字节从指定的byte数组写入此输出流。
void write(byte[] b,int off,int len):将指定byte数组中从偏移量off开始的len个字节写入此输出流。
abstract void write(int b):将指定的字节写入此输出流。
例:
2. Writer的方法
Writer append(char c):将指定字符添加到此writer。
Writer append(CharSequence csq):将指定字符序列添加到此 writer。
Writer append(CharSequence csq,int start,int end):将指定字符序列的子序列添加到此writer.Appendable。
abstract void close():关闭此流,但要先刷新它。
abstract void flush():刷新该流的缓冲。
void write(char[] cbuf):写入字符数组。
abstract void write(char[] cbuf,int off,int len):写入字符数组的某一部分。
void write(int c):写入单个字符。
void write(String str):写入字符串。
void write(String str,int off,int len):写入字符串的某一部分。
例: