IO流
1,概述
- I表示intput,把硬盘文件中的数据读入到内存的过程,称之输入,负责读。
- O表示output,把内存中的数据写出到硬盘文件的过程,称之输出,负责写。
2,IO流的四大类:
- 字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流称为字节输入流。
- 字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流称为字节输出流。
- 字符输入流:以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入到内存中去的流称为字符输入流。
- 字符输出流:以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络介质中去的流称为字符输出流。
2.1 文件字节输入流:FileInputStream
- 作用:以内存为基准,把磁盘文件中的数据以字节的形式读取到内存中去。
构造器 | 说明 |
---|
public FileInputStream(File file) | 创建字节输入流管道与源文件对象接通 |
public FileInputStream(String pathname) | 创建字节输入流管道与源文件路径接通 |
方法名称 | 说明 |
---|
public int read() | 每次读取一个字节返回,如果字节已经没有可读的返回-1 |
public int read(byte[] buffer) | 每次读取一个字节数组返回,如果字节已经没有可读的返回-1 |
一般不用read() 方法读取单个字节,性能慢,使用读取字节数组方法,性能较快。
每次读取一个字节存在什么问题? 性能较慢,读取中文字符输出无法避免乱码问题。
每次读取一个字节数组存在什么问题?读取的性能得到了提升,读取中文字符输出无法避免乱码问题。
2.2 文件字节输出流:FileOutputStream
- 作用:以内存为基准,把内存中的数据以字节的形式写出到磁盘文件中去的流。
构造器 | 说明 |
---|
public FileOutputStream(File file) | 创建字节输出流管道与源文件对象接通 |
public FileOutputStream(File file,boolean append) | 创建字节输出流管道与源文件对象接通,可追加数据 |
public FileOutputStream(String filepath) | 创建字节输出流管道与源文件路径接通 |
public FileOutputStream(String filepath,boolean append) | 创建字节输出流管道与源文件路径接通,可追加数据 |
文件字节输出流(FileOutputStream)写数据出去的API
方法名称 | 说明 |
---|
public void write(int a) | 写一个字节出去 |
public void write(byte[] buffer) | 写一个字节数组出去 |
public void write(byte[] buffer , int pos , int len) | 写一个字节数组的一部分出去。 |
流的关闭与刷新
方法名称 | 说明 |
---|
flush() | 刷新流,刷新数据,还可以继续写数据 |
close() | 关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据 |
字节输出流如何实现写出去的数据能换行?os.write(“\r\n”.getBytes())
IO流:资源释放的方式
JDK 7和JDK9中都简化了资源释放操作
try(定义流对象){
可能出现异常的代码;
}catch(异常类名 变量名){
异常的处理代码;
}
资源用完最终自动释放
定义输入流对象;
定义输出流对象;
try(输入流对象;输出流对象){
可能出现异常的代码;
}catch(异常类名 变量名){
异常的处理代码;
}
资源用完最终自动释放
注意:JDK 7 以及 JDK 9的()中只能放置资源对象,否则报错,什么是资源呢?资源都是实现了Closeable/AutoCloseable接口的类对象
2.3 文件字符输入流:FileReader
- 作用:以内存为基准,把磁盘文件中的数据以字符的形式读取到内存中去。
构造器 | 说明 |
---|
public FileReader(File file) | 创建字符输入流管道与源文件对象接通 |
public FileReader(String pathname) | 创建字符输入流管道与源文件路径接通 |
方法名称 | 说明 |
---|
public int read() | 每次读取一个字符返回,如果字符已经没有可读的返回-1 |
public int read(char[] buffer) | 每次读取一个字符数组,返回读取的字符个数,如果字符已经没有可读的返回-1 |
2.4 文件字符输出流:FileWriter
- 作用:以内存为基准,把内存中的数据以字符的形式写出到磁盘文件中去的流。
构造器 | 说明 |
---|
public FileWriter(File file) | 创建字符输出流管道与源文件对象接通 |
public FileWriter(File file,boolean append) | 创建字符输出流管道与源文件对象接通,可追加数据 |
public FileWriter(String filepath) | 创建字符输出流管道与源文件路径接通 |
public FileWriter(String filepath,boolean append) | 创建字符输出流管道与源文件路径接通,可追加数据 |
文件字符输出流(FileWriter)写数据出去的API
方法名称 | 说明 |
---|
public void write(int c) | 写一个字符 |
public void write(char[] cbu) | 写一个字符数组 |
public void write(char[] cbuf, int off, int len) | 写入字符数组的一部分 |
public void write(String str) | 写一个字符串 |
public void write(String str, int off, int len) | 写一个字符串的一部分 |
流的关闭与刷新
方法名称 | 说明 |
---|
flush() | 刷新流,刷新数据,还可以继续写数据 |
close() | 关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据 |
字节流、字符流的使用场景总结
1,字节流适合做一切文件数据的拷贝(音视频,文本)
2,字节流不适合读取中文内容输出
3,字符流适合做文本文件的操作(读,写)
2.5 缓冲流
- 缓冲流也称为高效流、或者高级流。之前的字节流可以称为原始流。
- 作用:缓冲流自带缓冲区、可以提高原始字节流、字符流读写数据的性能
字节缓冲流
- 字节缓冲输入流:BufferedInputStream,提高字节输入流读取数据的性能。
- 字节缓冲输出流:BufferedOutputStream,提高字节输出流读取数据的性能。
构造器 | 说明 |
---|
public BufferedInputStream(InputStream is) | 可以把低级的字节输入流包装成一个高级的缓冲字节输入流管道,从而提高字节输入流读数据的性能 |
public BufferedOutputStream(OutputStream os) | 可以把低级的字节输出流包装成一个高级的缓冲字节输出流,从而提高写数据的性能 |
字节缓冲流性能优化原理:
字节缓冲输入流自带了8KB缓冲池,直接从缓冲池读取数据,所以性能较好。
字节缓冲输出流自带了8KB缓冲池,数据就直接写入到缓冲池中去,写数据性能极高了。
字符缓冲流
- 字符缓冲输入流:BufferedReader。
- 字符缓冲输出流:BufferedWriter。
构造器 | 说明 |
---|
public BufferedReader(Reader r) | 可以把低级的字符输入流包装成一个高级的缓冲字符输入流管道,从而提高字符输入流读数据的性能 |
public BufferedWriter(Writer w) | 可以把低级的字符输出流包装成一个高级的缓冲字符输出流管道,从而提高字符输出流写数据的性能 |
字符缓冲输入流新增功能
方法 | 说明 |
---|
public String readLine() | 读取一行数据返回,如果读取没有完毕,无行可读返回null |
字符缓冲输出流新增功能
方法 | 说明 |
---|
public void newLine() | 换行操作 |
2.6 转换流
字符输入转换流
- 字符输入转换流:InputStreamReader,可以把原始的字节流按照指定编码转换成字符输入流。
构造器 | 说明 |
---|
public InputStreamReader(InputStream is) | 可以把原始的字节流按照代码默认编码转换成字符输入流。几乎不用,与默认的FileReader一样。 |
public InputStreamReader(InputStream is ,String charset) | 可以把原始的字节流按照指定编码转换成字符输入流,这样字符流中的字符就不乱码了(重点) |
字符输出转换流
- 字符输入转换流:OutputStreamWriter,可以把字节输出流按照指定编码转换成字符输出流。
构造器 | 说明 |
---|
public OutputStreamWriter(OutputStream os) | 可以把原始的字节输出流按照代码默认编码转换成字符输出流。几乎不用。 |
public OutputStreamWriter(OutputStream os,String charset) | 可以把原始的字节输出流按照指定编码转换成字符输出流(重点) |
2.7 序列化对象
对象序列化与对象反序列化:
- 以内存为基准,把内存中的对象存储到磁盘文件中去,称为对象序列化。
- 以内存为基准,把存储到磁盘文件中去的对象数据恢复成内存中的对象,称为对象反序列化。
- 对象序列化使用到的流是对象字节输出流:ObjectOutputStream
- 对象反序列化使用到的流是对象字节输入流:ObjectInputStream
构造器 | 说明 |
---|
public ObjectOutputStream(OutputStream out) | 把低级字节输出流包装成高级的对象字节输出流 |
public ObjectInputStream(InputStream in) | 把低级字节输如流包装成高级的对象字节输入流 |
序列化方法
方法 | 说明 |
---|
public final void writeObject(Object obj) | 把对象写出去到对象序列化流的文件中去 |
public Object readObject() | 把存储到磁盘文件中去的对象数据恢复成内存中的对象返回 |
2.8 打印流
- 作用:打印流可以实现方便、高效的打印数据到文件中去。打印流一般是指:PrintStream,PrintWriter两个类。
- 可以实现打印什么数据就是什么数据,例如打印整数97写出去就是97,打印boolean的true,写出去就是true。
PrintStream
构造器 | 说明 |
---|
public PrintStream(OutputStream os) | 打印流直接通向字节输出流管道 |
public PrintStream(File f) | 打印流直接通向文件对象 |
public PrintStream(String filepath) | 打印流直接通向文件路径 |
方法 | 说明 |
---|
public void print(Xxx xx) | 打印任意类型的数据出去 |
PrintWriter
构造器 | 说明 |
---|
public PrintWriter(OutputStream os) | 打印流直接通向字节输出流管道 |
public PrintWriter (Writer w) | 打印流直接通向字符输出流管道 |
public PrintWriter (File f) | 打印流直接通向文件对象 |
public PrintWriter (String filepath) | 打印流直接通向文件路径 |
方法 | 说明 |
---|
public void print(Xxx xx) | 打印任意类型的数据出去 |