java IO相关的类很多,不常用的很难记得住,可以参考这篇文章,总结了Java的IO体系。
从数据来源或者说是操作对象角度看,IO 类可以分为:
- 文件(file):FileInputStream、FileOutputStream、FileReader、FileWriter
- 数组([]):
- 字节数组(byte[]):ByteArrayInputStream、ByteArrayOutputStream
- 字符数组(char[]):CharArrayReader、CharArrayWriter
- 管道操作:PipedInputStream、PipedOutputStream、PipedReader、PipedWriter
- 基本数据类型:DataInputStream、DataOutputStream
- 缓冲操作:BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter
- 打印:PrintStream、PrintWriter
- 对象序列化反序列化:ObjectInputStream、ObjectOutputStream
- 转换:InputStreamReader、OutputStreWriter
从数据传输方式或者说是运输方式角度看,可以将 IO 类分为: 1、字节流 2、字符流
IO 类虽然很多,但最基本的是 4 个抽象类:InputStream、OutputStream、Reader、Writer。最基本的方法也就是一个读 read() 方法、一个写 write() 方法。具体的例子可以参考上面的链接。
我们常用的也就是文件相关的几个类,如文件最基本的读写类 File 开头的、文件读写带缓冲区的类 Buffered 开头的类,对象序列化反序列化相关的类 Object 开头的类。
InputStream 类
- public abstract int read() 读取数据
- public int read(byte b[]) 将读取到的数据放在 byte 数组中,该方法实际上是根据下面的方法实现的,off 为 0,len 为数组的长度
- public int read(byte b[], int off, int len) 从第 off 位置读取 len 长度字节的数据放到 byte 数组中,流是以 -1 来判断是否读取结束的
OutputStream 类
- public abstract void write(int b) 写入一个字节,可以看到这里的参数是一个 int 类型,对应上面的读方法,int 类型的 32 位,只有低 8 位才写入,高 24 位将舍弃。
- public void write(byte b[]) 将数组中的所有字节写入,和上面对应的 read() 方法类似,实际调用的也是下面的方法。
- public void write(byte b[], int off, int len) 将 byte 数组从 off 位置开始,len 长度的字节写入
Reader 类
- public int read(java.nio.CharBuffer target) 读取字节到字符缓存中
- public int read() 读取单个字符
- public int read(char cbuf[]) 读取字符到指定的 char 数组中
- abstract public int read(char cbuf[], int off, int len) 从 off 位置读取 len 长度的字符到 char 数组中
Writer 类
- public void write(int c) 写入一个字符
- public void write(char cbuf[]) 写入一个字符数组
- abstract public void write(char cbuf[], int off, int len) 从字符数组的 off 位置写入 len 数量的字符
- public void write(String str) 写入一个字符串
- public void write(String str, int off, int len) 从字符串的 off 位置写入 len 数量的字符
- public Writer append(CharSequence csq) 追加吸入一个字符序列
- public Writer append(CharSequence csq, int start, int end) 追加写入一个字符序列的一部分,从 start 位置开始,end 位置结束
- public Writer append(char c) 追加写入一个 16 位的字符