一、IO概念
• I/O 即输入Input/ 输出Output的缩写,其实就是计算机调度把各个存储中(包括内存和外部存储)的数据写入写出的过程;
• java中用“流(stream)”来抽象表示这么一个写入写出的功能,封装成一个“类”,都放在java.io这个包里面。
二、IO流的分类
通过“流”的形式允许java程序使用相同的方式来访问不同的输入/输出源。stream是从起源(source)到接收的(sink)的有序数据。我们这里把输入/输出源对比成“水桶”,那么流就是“管道”,这个“管道”的粗细、单向性等属性也就是区分了不同“流”的特性。
按照 流的方向 进行分类:
以内存作为参照物:
往内存中去:叫做输入(Input)。或者叫做读(Read)。
从内存中出来:叫做输出(Output)。或者叫做写(Write)。
按照 读取数据方式 不同进行分类:
按照 字节 的方式读取数据,一次读取1个字节byte,等同于一次读取8个二进制位。
这种流是万能的,什么类型的文件都可以读取。包括:文本文件,图片,声音文件,视频文件 等…
按照 字符 的方式读取数据的,一次读取一个字符。
这种流是为了方便读取普通文本文件而存在的,这种流不能读取:图片、声音、视频等文件。只能读取纯文本文件,连word文件都无法读取。
注意:
纯文本文件,不单单是.txt文件,还包括 .java、.ini、.py 。总之只要 能用记事本打开 的文件都是普通文本文件。
eg.
假设文件file1.txt,采用字符流的话是这样读的:
a中国bc张三fe
第一次读:'a’字符('a’字符在windows系统中占用1个字节。)
第二次读:'中’字符('中’字符在windows系统中占用2个字节。)
综上所述:流的分类:
输入流、输出流
字节流、字符流
根据传输数据单位分为字节流和字符流
• 字节流:以字节为单元,可操作任何数据(由InputStream和outPutStream作为基类)
• 字符流:以字符为单元,只能操作纯字符数据,(由Reader和Writer作为基类)
- 字节流
- java.io.InputStream 字节输入流
- java.io.OutputStream 字节输出流
- 字符流
- java.io.Reader 字符输入流
- java.io.Writer 字符输出流
以上4个类都是抽象类。
所有的流都实现了:
java.io.Closeable接口,所有流都实现 close() 方法。流是一个管道,是内存和硬盘之间的通道,用完之后一定要close(),不然会耗费(占用)很多资源。用完流一定要关闭。
所有的输出流都实现了:
java.io.Flushable接口,所有流都实现 flush() 方法。刷新flush()表示将通道/管道当中剩余未输出的数据强行输出完(清空管道!)刷新的作用就是清空管道。输出流在最终输出之后,一定要flush()刷新一下。
三、Java要掌握的流(16个)
文件专属:
java.io.FileInputStream
java.io.FileOutputStream
java.io.FileReader
java.io.FileWriter
转换流:(将字节流转换成字符流)
java.io.InputStreamReader
java.io.OutputStreamWriter
缓冲流专属:
java.io.BufferedReader
java.io.BufferedWriter
java.io.BufferedInputStream
java.io.BufferedOutputStream
数据流专属:
java.io.DataInputStream
java.io.DataOutputStream
标准输出流:
java.io.PrintWriter
java.io.PrintStream
对象专属流:
java.io.ObjectInputStream
java.io.ObjectOutputStream
File文件类
java.io.File
后续章节会对以上流进行逐个介绍。