概念:Java语言中数据流是接收和发送数据的管道。流是一位单项的。
流的分类:
按照字节字符:InputStream和OutputStream是字节输入输出流的抽象父类。Reader和Writer是字符输入和输出流的抽象父类。
按照是直接否从特定的地方(如磁盘,内存、设备)相连分为节点流和处理流
节点流:可以从一个或者向一个特定的地方(节点)读写数据;
处理流:对一个已经存在的流的连接和封装,通过封装的流的功能调用实现数据读写。处理流的构造总要带上其他流的对象作为参数。一个流的对象经过其他流的多次包装,称为流的链接。
1、InputStream
有三个方法访问其数据:
(1)int read(): 返回一个int值,它是从流中读取的一个字节,如果遇到文件结束返回-1.
(2)int read(byte []):将数据读到字节数组中,并返回读到的字节数。
(3)int read(byte [], int offest, int length):将数据读到字节数组中,并返回读到的字节数。offest为数组的偏移量。
其它常用的方法:close() available() skip() reset()
2、OutputStream
与InputStream相应的方法:write(int) write(byte[]) write(byte[],int,int)
flash():有时输入流在积累了若干次之后才真正的进行写操作,flash可强制进行写操作。
3、Reader
读取方法:
(1)int read(): 返回一个int值,它是从流中读取的一个字符,如果遇到文件结束返回-1.
(2)int read(char []):将数据读到字符数组中,并返回读到的字符数。
(3)int read(byte [], int offest, int length):将数据读到字符组中,并返回读到的字符数。offest为数组的偏移量。
4、Writer
write(char) write(char[]) write(char[],int,int),write(String,Stirng),write(Stirng,int,int),close(),flash()
对象的串行化(序列化)
1、实现接口java.io.Serializable。该接口没有任何方法,只作为一个标记,用来声明实现这个接口的类是可序列化的。
2、当一个对象被串行化,只有对象的数据被串行化,方法和构造函数不属于串行化流。如果一个数据变量是一个对象的引用,那么呢这个对象的数据成员也会被串行化。
节点流:
System.in/.out/.err 的返回值是PrintStream对象
ByteArrayInputStream 流的关闭无效(关闭后仍可使用,在内存中,可自动释放)
ByteArrayOutputStream 关闭流无效;可使用 toByteArray() 和 toString() 获取数据。
方法:writeTo(OutputStream out) 将此 byte 数组输出流的全部内容写入到指定的输出流参数中。
FileInputStream 文件输入流
FileOutputStream 文件输出流
处理流:
1、缓冲流,增强功能;BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter
2、转换流,处理乱码 {
编码:字符----编码字符集--->>二进制
解码:二进制----解码字符集--->>字符
乱码原因:
(1)、编码与解码的字符集不同
(2)、字节数组长度不够
转换流:字节转换为字符
输出流 outputStreamWriter 编码
输入流 inputStreamReader 解码
3、数据输入及输出流
DataInputStream、DataOutputStream
1、读取顺序及类型与写入顺序及数据类型必须一致。
writeBytes(str); 字符串对象的第一种写法
writeChars(str); 字符串对象的第2种写法
writeUTF(sj11); 字符串对象的第3种写法,此方法用的较多
4、对象
反序列化 输入流 ObjectIntputStream 方法:readObject()
序列化 输出流 ObjectOutputStream 方法:writeObject()
注意:
1、先序列化后反序列化;反序列化顺序必须与序列化一致
2、不是所有的对象都可以序列化,transient dataType
5、打印流PrintStream
System.in/out/err 返回值为该类型
调试应用:可将控制台输出保存在文件中