IO流
以内存为参照物
- 输入流 外设→内存
- 输出流 内存→外设
字节流
字节流输出流
抽象基类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) 将指定的字节写入此输出流。 |
注意:
write 的常规协定是:向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略
具体子类
FileOutputStream
FileOutputStream(File file) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。 |
FileOutputStream(File file, boolean append) 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。 |
FileOutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。 |
FileOutputStream(String name, boolean append) 可以追加 |
成员方法与抽象基类一致,没有额外的成员方法
System.lineSeparator()默认换行符
try-with-resources 可以自动关闭
// 语法 try(资源,实现了AutoCloseable){ // 代码 }catch(){ }finally{ }
BufferedOutStream
构造方法
BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流,以将数据写入指定的底层输出流。默认缓冲区大小是8KB |
BufferedOutputStream(OutputStream out, int size) 创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。 |
以底层流为参数,包装流
- flush方法会把数据从缓冲区中刷新到流中
- close方法会去自动执行flush
- 所以带缓冲区的输出流,都需要flush.
如果没有flush的话会出现文件为空的情况
字节输入流
抽象基类InputStream
成员方法
abstract int | read() 从输入流中读取数据的下一个字节。 |
int | read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。 |
int | read(byte[] b, int off, int len) 将输入流中最多 len 个数据字节读入 byte 数组。 |
注意:
- 返回 0 到 255 范围内的 int 字节值。如果因为已经到达流末尾而没有可用的字节,则返回值 -1。在输入数据可用、检测到流末尾或者抛出异常前,此方法一直阻塞
- 如果是读取单个字节 ,返回值是字节值 readData
- 如果是读取字节数组,返回值是读取到的字节的个数 readCount
具体子类
FileInputStream
构造方法
FileInputStream(File file) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。 |
FileInputStream(String name) 通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。 |
成员方法和抽象基类一致
BufferedInputStream
构造方法
BufferedInputStream(InputStream in) 创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。默认8KB |
BufferedInputStream(InputStream in, int size) 创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。 |
字符流
本质:字节流+编码表
字符输出流
抽象基类Writer
成员方法
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) 写入字符串的某一部分。 |
注意:
write(int c)
要写入的字符包含在给定整数值的 16 个低位中,16 高位被忽略。
具体子类
转换流OutputStreamWriter
将字节流转换为字符流,可以使用指定的编码表,默认使用的是系统自带的
构造方法
OutputStreamWriter(OutputStream out) 创建使用默认字符编码的 OutputStreamWriter。 |
OutputStreamWriter(OutputStream out, String charsetName) 创建使用指定字符集的 OutputStreamWriter。 |
简化流FileWriter
构造方法
FileWriter(File file) 根据给定的 File 对象构造一个 FileWriter 对象。 |
FileWriter(File file, boolean append) 根据给定的 File 对象构造一个 FileWriter 对象。 |
FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象。 |
FileWriter(String fileName, boolean append) 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。 |
字符缓冲输出流BufferedWriter
构造方法
BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流。 |
BufferedWriter(Writer out, int sz) 创建一个使用给定大小输出缓冲区的新缓冲字符输出流。 |
独有的成员方法:newLine() 写入一个行分隔符,即换行
字符输入流
抽象基类Reader
成员方法
int | read() 读取单个字符。readData |
int | read(char[] cbuf) 将字符读入数组。 readCount |
abstract int | read(char[] cbuf, int off, int len) 将字符读入数组的某一部分 |
作为整数读取的字符,范围在 0 到 65535 之间 (0x00-0xffff),如果已到达流的末尾,则返回 -1
具体子类
转换流InputStreamReader
将字节流转换为字符流,可以指定编码表
构造方法
InputStreamReader(InputStream in) 创建一个使用默认字符集的 InputStreamReader。 |
InputStreamReader(InputStream in, String charsetName) 创建使用指定字符集的 InputStreamReader。 |
简化流FileReader
构造方法
FileReader(File file) 在给定从中读取数据的 File 的情况下创建一个新 FileReader。 |
FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader。 |
字符缓冲输入流BufferedReader
构造方法
BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。默认缓冲区大小16KB |
BufferedReader(Reader in, int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流。 |
除了3个继承的read方法外,独有一个readLine方法
String | readLine() 读取一个文本行。 |
包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null |
其他流
数据流
DataOutputStream
构造方法
DataOutputStream(OutputStream out) 创建一个新的数据输出流,将数据写入指定基础输出流。
成员方法
每个java基本数据类型都有1个与之相对应的write方法 比如 int writeInt(int i)
DataInputStream
构造方法
DataInputStream(InputStream in) 使用指定的底层 InputStream 创建一个 DataInputStream。
成员方法
每个java基本数据类型都有1个与之相对应的read方法 比如 int readInt()
这里要注意,以什么顺序写的,就要按什么顺序读,否则会乱码
打印流
PrintStream
PrintWriter
打印流的4个特点
- 只能操作目的地,不能操作数据来源。
- 没有一个输入流与之对应
- 可以操作任意类型的数据。
如果启动了自动刷新,能够自动刷新。
- 使用条件 如果启用了自动刷新,则只有在调用
println
、printf
或format
的其中一个方法时才可能完成此操作
标准输入流与标准输出流
标准输出流
- System.out
- 本质是字节打印流 PrintStream
- 默认输出设备 显示器
标准输入流
- System.in
- 默认输入设备 键盘
- 本质是 普通的字节输入流
对象流(序列化与反序列化流)
序列化:将对象数据转换为二进制数据存储到磁盘中
反序列化:把磁盘的二进制数据还原为对象信息
ObjectOutputStream
构造方法
ObjectOutputStream(OutputStream out)
成员方法
void | writeObject(Object obj) 将指定的对象写入 ObjectOutputStream。 |
ObjectInputStream
构造方法
ObjectInputStream(InputStream in)
成员方法
Object | readObject() 从 ObjectInputStream 读取对象。 |
这里值得注意的是,因为我们可以往流中放入null值,readObject并不能通过!=-1或者null来判断是否读取到末尾了,因此我们只能通过捕捉EOFException异常来判断读取到末尾
注意:
1.必须实现了Serializable接口的对象才能序列化
2.修改了类的信息 会报错 java.io.InvalidClassException
可以显式的声明这个serialVersionUID 来解决
3.用transient关键字修饰可以让成员变量不被序列化,在反序列化的时候也只能得到该成员的默认值