Java流式输入输出原理
输入流(InputStream):程序从输入流读取数据源。数据源包括外界(键盘、文件、网络…),即是将数据源读入到程序的通信通道。输入流不关心数据源来自何种设备(键盘,文件,网络)。
输出流:(OutputStream):程序向输出流写入数据。将程序中的数据输出到外界(显示器、打印机、文件、网络…)的通信通道。输出流不关心数据的目的是何种设备(键盘,文件,网络)。
Java流类的分类
Java.io包中定义了多个流类型来实现输入/输出功能。按数据流的方向可以分为输出流和输入流。按处理数据=单位不同可以分为字节流和字符流。按照功能不同可以分为节点流和处理流。Java.io包内都分别继承自一下四种抽象流类型。
![](https://img.haomeiwen.com/i1733412/ff44bbb182f022da.png)
节点流和处理流
节点流:是可以从一个特定的数据源(节点)读写数据。
处理流:是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更强大的读写功能。
输入/输出流类
InputStream:继承自InputStream的流都是用于向程序中输入数据,且数据的单位为字节(8bit),下图中深色为节点流,浅色为处理流。
![](https://img.haomeiwen.com/i1733412/174d406346cf2a4b.png)
InputStream的基本方法:
![](https://img.haomeiwen.com/i1733412/e85468ad420d72a3.png)
OutputStream:继承自OutputStream的流都是用于向程序中输出数据,且数据的单位为字节(8bit),下图中深色为节点流,浅色为处理流。
![](https://img.haomeiwen.com/i1733412/05144e42fa646bcf.png)
OutputStream的基本方法(调用出close方法之前,先调用flush方法,flush方法的意思是先把缓存区里的数据写出去然后在进行关闭)
![](https://img.haomeiwen.com/i1733412/2a3167a276fc4d46.png)
Reader:继承自Reader的流都是用于向程序中输入数据,且数据的单位为字符(16bit),下图中深色为节点流,浅色为处理流。
![](https://img.haomeiwen.com/i1733412/eb9894240a2374a0.png)
Reader的基本方法
![](https://img.haomeiwen.com/i1733412/c9e44cf5ba545857.png)
Writer:继承自Writer的流都是用于向程序中输出数据,且数据的单位为字符(16bit),下图中深色为节点流,浅色为处理流。
![](https://img.haomeiwen.com/i1733412/97a8a3177a434b0e.png)
Writer的基本方法(调用出close方法之前,先调用flush方法,flush方法的意思是先把缓存区里的数据写出去然后在进行关闭)
![](https://img.haomeiwen.com/i1733412/f80363fb647c64a9.png)
节点流类型(结尾Stream的是字节流,结尾是Reader/Writer的是字符流)
![](https://img.haomeiwen.com/i1733412/1a32e8b04064103b.png)
FileInprtStream例子
![](https://img.haomeiwen.com/i1733412/61d6bcf99e4174ac.png)
控制台输出结果
![](https://img.haomeiwen.com/i1733412/3804acd1607ed204.png)
FileOutputStream例子
![](https://img.haomeiwen.com/i1733412/e2e47c43046f0d21.png)
控制台输出结果
![](https://img.haomeiwen.com/i1733412/4b0a6565c7132783.png)
查找写入文件地址
![](https://img.haomeiwen.com/i1733412/ec6c777104b2b1fe.png)
FileReader例子
![](https://img.haomeiwen.com/i1733412/7fe3bce804330a8f.png)
控制台输出结果
![](https://img.haomeiwen.com/i1733412/2cb9ceae153bf722.png)
FileWriter例子
![](https://img.haomeiwen.com/i1733412/29121d6da325f2ab.png)
控制台输出结果
![](https://img.haomeiwen.com/i1733412/ca269b00965e133e.png)
查找写入文件的地址
![](https://img.haomeiwen.com/i1733412/90e368ef6481f7db.png)
处理流类型
![](https://img.haomeiwen.com/i1733412/dc6629743f66eefc.png)
缓冲流
缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率。缓冲流分为四种:BufferedReader,BufferedWriter,BufferedInputStream,BufferedOutputStream.其常用方法:
![](https://img.haomeiwen.com/i1733412/90d3875c1bab1e46.png)
注意事项
![](https://img.haomeiwen.com/i1733412/05e2131cc8a54f7f.png)
BufferedInputStream例子
![](https://img.haomeiwen.com/i1733412/e85124805d75b7c7.png)
控制台输出结果
![](https://img.haomeiwen.com/i1733412/5a401a34e0d66bd8.png)
BufferedReader/BufferedWriter例子
![](https://img.haomeiwen.com/i1733412/461011f927371460.png)
控制台输出结果
![](https://img.haomeiwen.com/i1733412/6b26548f00b4ba04.png)
查找写入文件的地址
![](https://img.haomeiwen.com/i1733412/e245edfbb0d84b27.png)
转换流
![](https://img.haomeiwen.com/i1733412/1d21492e3b2aceb7.png)
OutputStreamWriter例子
![](https://img.haomeiwen.com/i1733412/e87e425e81753beb.png)
控制台输出结果
![](https://img.haomeiwen.com/i1733412/c93fbd8762b719d6.png)
查找写入文件的地址(有追加)
![](https://img.haomeiwen.com/i1733412/d34e1310660f69bf.png)
查找写入文件的地址(没有追加)
![](https://img.haomeiwen.com/i1733412/0a30b145b8ae7011.png)
InputStreamReader例子
![](https://img.haomeiwen.com/i1733412/f95207415383d5ed.png)
控制台输出结果
![](https://img.haomeiwen.com/i1733412/70e7722d22e2a03a.png)
数据流
![](https://img.haomeiwen.com/i1733412/7c7beea523112053.png)
DataOutputStream,DataInputStream例子
![](https://img.haomeiwen.com/i1733412/c3e446b70cc6c49b.png)
控制台输出结果
![](https://img.haomeiwen.com/i1733412/834b49d375c0b205.png)
Print流(输出/打印流,Print没有输入流)
![](https://img.haomeiwen.com/i1733412/101215cf524acbff.png)
PrintWriter例子
![](https://img.haomeiwen.com/i1733412/13acafc0dbb1697a.png)
控制台输出结果
![](https://img.haomeiwen.com/i1733412/9ee8c2081a6af07e.png)
查找写入文件的地址
![](https://img.haomeiwen.com/i1733412/d186cf85b434f4bc.png)
Object流
![](https://img.haomeiwen.com/i1733412/10d299983d660bdc.png)
Object流例子
![](https://img.haomeiwen.com/i1733412/dc74c88497acdb6d.png)
控制台输出结果(有transient修饰的)
![](https://img.haomeiwen.com/i1733412/cf9594f403b22c55.png)
控制台输出结果(没有transient修饰的)
![](https://img.haomeiwen.com/i1733412/bcc3b82601b46605.png)
serializable接口和externallzable接口的区别
serializable接口:用来标记类的对象可以被实例化(不可控制)
externallzable接口:可控实例化(不常用)
网友评论