一篇文章带你理解Java的IO流
文章目录
1,基础概念
IO :input(输入)、output(输出)
内存与存储设备之间的数据传输通道。
2,流的分类
- 按方向分
输入流:将存储设备中的内容读入到内存中。
输出流:将内存中的内容写到存储设备中。
- 按单位分
字节流:以字节为单位。
字符流:以字符为单位。
- 按功能分
节点流:具有实际传输数据的读写功能。
过滤流(装饰类):在节点流的基础上增强功能
形容一个流时:单位 + 方向 + 功能 + 流
3,字节流
3.1 字节流的父类
- InputStream :字节输入流
主要方法:
1,public abstract int read() throws IOException;
从输入流中读取数据的下一个字节
2,public abstract int read(byte[] b) throws IOException;
从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
3,public int readd(byte[] b, int off , int len);
将输入流中最多 len 个数据字节读入 byte 数组。尝试读取 len 个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数
- OutputStream :字节输出流
主要方法:
1,public abstract void write(int b)throws IOException
将指定的字节写入此输出流
2,public void write(byte[] b)throws IOException
将 b.length 个字节从指定的 byte 数组写入此输出流
3,public void write(byte[] b,int off,int len)throws IOException:
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流
3.2 字节节点流
字节输出节点流:FileOutputStream
字节输入节点流:FileInputStream
3.3 字节过滤流(装饰类)
- 缓冲流
字节输入缓冲流:BufferedInputStream
字节输出缓冲流:BufferedOutputStream
使用缓冲流的好处:
1,提高IO效率,减少访问磁盘的次数
2,数据存在缓冲区中,flush是将缓冲区的内容写入到文件中,同时清空缓存;也可以直接close,调用close会先使用flush,清空缓存,然后关闭资源。(凡是使用流必须使用close)
- 数据流
字节输入数据流:DataInputStream
字节输出数据流:DataOutputStream
数据流可以直接读写8种基本数据类型和String。
- 对象流
字节输入对象流:ObjectInputStream
字节输出对象流:ObjectOutputStream
使用对象流的好处:
1,增强缓冲区功能。
2,直接读写8种基本数据类型和String
3,增强读写对象
4,读入的对象必须实现serializable接口,进行对象序列化
3.4 对象序列化
对象序列化:将对象转成二进制文件的过程(输出)。
对象反序列化:将序列化过程中生成的二进制码串转换成对象。
对象序列化细节:
1,必须实现
serializable
接口。
2,必须保证让对象的所有属性序列化。
3,transient修饰属性时,不参与对象序列化。
4,字符流
4.1 字符流的概念
字符流:就是在字节流的基础上,加上编码,形成的数据流。
字符流出现的意义:因为字节流在操作字符时,可能会有中文导致的乱码,所以由字节流引申出了字符流。
4.2 字符输入流:Reader
常用子类:FileReader
文件字符流的常用方法:
1,read();
2,read(char[ ]);
3,read(char[ ] ,offset,len);
4.3 字符输出流: Writer
常用子类:文件字符输出流: Filewriter
文件字符输出常用方法:
writer();
writer(char[ ]);
writer(char[ ],offset,len);
writer(string);
flush()刷新缓冲区
注意:close()
方法默认调用了flush()
方法,但是flush()
方法只刷新缓冲区,而close()
还会关闭IO流。
5,小结
本篇文章简单介绍了使用Java中的IO流,由于纯手打,难免会有纰漏,如果发现错误的地方,请第一时间告诉我,这将是我进步的一个很重要的环节。