IO流分为两种: 流IO(java.io)和块IO(java.nio)
流IO:简单好用,但是效率较低
块IO:效率很高,但是编程复杂
流的基本概念
在电脑上的数据有三中存储方法,一种是外存、一种是内存、一种是缓存。比如电脑上的硬盘,磁盘,U盘等都是外存,电脑上有内存条,缓存是在CPU里面的。外存的存储量是最大的,最后是内存,其次是缓存,但是外存的数据读取最慢,其次是内存,缓存最快。这里总结从外存读取数据到内存以及将数据从内存写到外存中。对于内存和外存的理解,我们可以简单的理解为容器,即外存是一个容器,内存又是一个容器。那又怎么样把放在外存这个容器的数据读取到内存这个容器以及怎么把这个容器里的数据存到外存中呢?
在java类库中,IO部分的内容是很庞大的,因为它涉及的领域很广泛:
在标准输入输出,文件的操作,网咯上的数据流,字符串流,对象流,zip文件流等等,java中将输入输出抽象称为流,就像水管,将俩个容器连接起来,将数据从外存中读取到内存中的称为输入流,将数据从内存写入外存中的称为输出流。
- 根据流向分为输入和输出两种:
注意:输入流和输出流是相对于程序而言的。
输出:把程序(内存)中的内容输出到磁盘、光盘等储存设备中
输入:读取外部数据(磁盘、光盘等储存设备的数据)到程序(内存)中来
综合起来:
- 根据传输数据单位分为字节流和字符流
字节流 | 字符流 | |
输出流 | OutputStream(输出字节流) 字节输出流 | Writer 字符输出流 |
输入流 | InputStream(输入字节流) 字节输入流 | Reader 字符输入流 |
上面的也是java IO流找中的四大其本流。并且这四大基本流都是抽象流,其他流都是继承这四大基本流的。
- 字节流:数据流中最小的数据单元是字节。
- 字符流:数据流中最小的数据单元是字符,java中的字符是Unicode编码,一个字符占用两个字节(无论是中文还是英文都是两个字节)。
- 根据功能分为节点流和包装流
节点流:可以从或向一个特定了地方(节点)读取数据,直接连接数据源。如最常见的是文件FileReader,还可以是数组、管道、字符串、关键字分别为ByteArray/CharArray,Piped,String。
处理流(包装流):并不直接连接数据源,是对一个已存在的流的连接和封装,是一种典型的装饰器设计模式,使用处理流的主要是为了更方便的执行输入输出工作,如PintStream,输出功能很强大,又如BufferedReader提供缓存机制,推荐输出时都使用处理流包装。
一个流对象经过其他流的多次包装,称为流的连接。
注意:一个IO流可以即是输入流又是字节流又或是其他方式分类的流类型,是不冲突的。比如FileInputStream,它既是输入流又是字节流还是文件节点流。
- 一些特别的流类型
转换流:转换流只有字节流转换为字符流,因为字符流使用起来更方便,我们只会向更方便使用的方向转化,比如:InputStreamReader与OutputSreamWriter。
缓冲流:有关键字Buffered(缓冲的),也是一种处理流,为其包装的流增加了缓存功能,提高了输入输出的效率,增加缓冲功能后需要使用flush()方法才能将缓冲区中的内容写入到实际的物理节点。但是,在现在版本的java中,只需要记得关闭输出流(调用close()(关闭的)方法),就会自动执行输出流的flush()方法,可以保证将缓冲区中的内容写入。
对象流:有关键字Object,主要用于将目标对象保存到磁盘中或允许在网咯中直接传输对象时使用(对象序列化),具体的参考java的序列化和反序列化。
操作IO流的模板:
1、创建源或目标对象
输入:把文件中的数据流向到程序中,此时文件是 源,程序是目标
输出:把程序中的数据流向到文件中,此时文件是目标,程序是源
2.创建IO流对象
输入:创建输入流对象
输出:创建输出流对象
- 具体的IO操作
- 关闭(close)资源
输入:输入流的close()方法
输出:输出流的close()方法
注意:程序中打开的文件IO资源不属于内存里的资源,垃圾回收机制无法回收该资源。如果不关闭该资源,那么磁盘的文件将一直被程序引用着,不能删除也不能修改。
所以应该手动调用close()方法关闭流资源