1. 输入/输出流
Java语言定义了许多类专门负责各种方式的输入/输出,这些类都被放在java.io包中。其中,所有输入流类
输入流类 | 输出流类 |
---|---|
都是抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类 | 都是抽象类OutputStream (字节输出流)或抽象类 Writer (字符输出流)的字类 |
字节流和字符流的区别:
- 每次读写的字节数不同;
- 字符流是块读写,字节流是字节读写;
- 字符流带有缓存,字节流没有。
java流在处理上分为字符流和字节流。字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。
字符流和字节流,一个属性范围小,一个属性范围大,字符流只能是字符这一种类型,但是字节流中可以是字符,可以是二进制文件,可以是音频,可以是各种各样的类型,只要符合字节形式存储的都可以接字节流,而字符流只能接字符。
1.1 输入流
InputStream类是字节输入流的抽象类,是所有字节输入流的父类。该类中所有方法遇到错误时都会引发IOException异常。下面是该类中一些方法的介绍:
方法 | 说明 |
---|---|
read() | 从输入流中读取数据的下一个字节。返回0~255范围内的int字节值。如果因为已经到达流末尾而没有可用的字节,则返回值为-1 |
read(byte[] b) | 从输入流中读入一定长度的字节,并以整数的形式返回字节数 |
mark(int readlimit) | 在输入流的当前位置放置一个标记,readlimit参数告知此输入流在标记位置失效前允许读取的字节数 |
reset() | 将输入指针返回到当前所作的标记处 |
skip(long n) | 跳过输入流上的n个字节并返回实际跳过的字节数 |
markSupported() | 如果当前流支持mark()/reset()操作就返回true |
close() | 关闭此输入流并释放与该流关联的所有系统资源 |
InputStream类的具体层次结构如下图所示:
并不是所有的InputStream类的子类都支持InputStream中定义的所有方法,如skip()、mark()、reset()等方法只对某些子类有用。
InputStream类是用来处理字节的,并不适合处理字符文本,Java为字符文本的输入专门提供了一套单独的类Reader,但Reader类并不是InputStram类的替换者,只是在处理字符串时简化了编程。Reader类是字符输入流的抽象类,所有的字符输入流的实现都是它的子类。Reader类的具体层次结构如下:
1.2 输出流
OutputStream类是字节输出流的抽象类,此抽象类是表示输出字节流的所有类的超类。OutputStream类的具体层次如图所示:
OutputStream类中的方法均返回void,在遇到错误时会引发IOException异常。下面对OutputStram类中的方法作简单介绍。
方法 | 介绍 |
---|---|
write(int b) | 将指定的字节写入此输出流 |
write(byte[] b) | 将b个字节从指定的byte数组写入此输出流 |
write(byte[] b, int off, int len) | 将指定byte数组中从偏移量off开始的len个字节写入此输出流 |
flush() | 彻底完成输出并清空缓存区 |
close() | 关闭输出流 |