流
概念
内存与存储设备之间传输数据的通道。(用程序读取,处理硬盘,u盘中的数据)
水借助管道传输,数据借助流传输。
通过IO可以完成对文件的读和写
以程序(代码)为中心,进来为输入,出去为输出
read input inputstream
write output outputstream
核心类
java.io包中最重要的是五个类三个接口。
File 文件类
InputStream 字节输入流
OutputStream 字节输出流
Reader 字符输入流
Writer 字符输出流
Closeable 关闭流接口
Flushable 刷新流接口
Serializable 序列化接口
分类
按方向:
输入流:
将存储设备中的内容读取到内存中input
输出流:
将内存中的内容写入到储存设备中output
以内存为参照,进内存为输入,出内存为输出。
按读取数据方式不同:
字节流:
一次读取一个字节byte,等同于一次读取8个二进制位。这种流是万能的。什么字节的文件都可以读取,包括文本,图片,视频,声音
例:file.txt
a一b二c三
第一次读取:a
第二次:读到一的一半
第三次:读一的另外一半
字符流:
一次读取一个字符,方便读取普通文本文件而存在的。只能读取纯文本文件txt
word文件不是普通文档。
例:file.txt
a一b二c三
第一次读取:a 一个字节
第二次读取:一 两个字节
a在win系统中是一个字节,在java中占两个字节
a是文件中的字符,所以占一个字节
以字符为单位,只能读写文本数据
底层还是基于字节流操作,内部自动搜寻了指定的码表。
按功能
节点流(底层流):
具有实际传输数据的读写功能
过滤流:
在节点流的基础之上增强功能
小结
java中的io流都已经写好了,程序员不需要关心。需要掌握,在java中已经提供了哪些流,每个流的特点是什么,每个流对象上的常用方法有哪些。
java中所有的流都在java.io.*下。
java中主要研究:怎么new流对象,调用流对象的哪个方法是读,哪个方法是写。
java io四大家族
四大家族的首领,是四个抽象类
java.io.InputStream 字节输入流
java.io.OutputStream 字节输出流
java.io.Reader 字符输入流
java.io.Writer 字符输出流
注意:
在java中 只要 类名 以stream结尾的都是字节流,以reader/writer结尾的都是字符流
共同点:
close()
所有的流都实现了java.io.closeable,都是可关闭的,都有close()方法
流是一个内存和硬盘之间的管道,用完之后要关闭,不然会耗费很多资源。
flush()
所有的输出流都实现了java.io.Flushable接口,都有flush()方法,用完输出流的时候一定要记得flush刷新一下。这个刷新表示将通道/管道中剩余未输出的数据强行输出完(清空管道。)刷新的作用就是清空管道。
如果没有flush,可能会导致丢失数据。
java.io包下需要掌握的流(16个)
-
file(文件)
- java.io.FileInputStream
- java.io.FileOutoutStream
- java.io.FileReader
- java.io.FileWriter
-
转换流(将字节流转换为字符流)
- java.io.InputStreamReader
- java.io.OutputStreamReader
-
buffered(缓冲流专属)
- java.io.BufferedInputStream
- java.io.BufferedOutputStream
- java.io.BufferedReader
- java.io.BufferedWriter
-
data(数据)
- java.io.DataInputStream
- java.io.DataOutputStream
-
标准输出流
- java.io.PrintWriter
- java.io.PrintStream
-
对象专属流
- java.io.ObjectInputStream
- java.io.ObjectOutputStream