数据的读入写出,文件的上传下载
流:一连串流动的数据,以先进先出的方式进行传输-------->流就是管道
数据源 ------>IO------->目的地
数据源:数据的来源
目的地:数据流向的位置
流的分类:
操作单元分:
字节流:万能流
字符流:纯文本内容的传输
流向分:以程序为中心
输入流,输出流
功能分:
节点流:真实能读入写出的
功能流:增强节点流的功能提高节点流的性能
流之间是相辅相成的
InputStream字节输入流中最上层的父类
文件流:FileInputStream
文件字节输入流-------节点 流,字节流,输入流
字节数组流:ByteArrayInputStream
字节数组输入流------节点流,字节流,输入流
操作字节数组,数据源是字节输入,建议使用字节数组输入流
操作文件,数据源文件,建议使用文件字节输入流
OutputStream字节输出流
FileOutputStream 文件字节输出流--------->节点流
ByteArrayOutputStream 字节数组输出流------>节点流
步骤:
- 构建流(指定目的地)
- 读入写出 write( )
- 刷出 flush( )
- 关闭 close( )后打开的先关闭
注意:
在输出流写出的时候,如果目的地文件不存在,系统会自动创建目的地文件,如果目的地所在路径不存在抛出异常.
字节流实现文件拷贝
数据源------>输入流------>程序------->输出流------->目的地
步骤:
- 构建流(输入,输出)
- 读入写出 write( )
- 刷出 flush( )
- 关闭 close( )后打开的先关闭
字符流(纯文本数据)
通过字符流实现文件拷贝
reader 字符输入流
FileReader文件字符输出流----------节点流
writer 字符输出流
FileWriter 文件字符输出流----------节点流
功能流
使用:包裹节点流使用
缓冲流:Buffered -----加快节点流的读写效率
字节缓冲流:
字节输入缓冲流:BufferedInputStream
字节输出缓冲流:BufferOutputStream
如果没有新增方法就可以发生多态
字符缓冲流:
字符输入缓冲流:BufferedReader
新增功能:String readLine( );读一行文字
字符输出缓冲流:BufferWriter
新增功能:void newLine( );写一个分隔符/换行符.
存在新增功能不能发生多态
Data流
Data流 | 基本数据类型流 : 读写数据+保留数据类型->基本数据类型|字符串
是字节流的功能流
DataInputStream Data输入流
新增功能 : readXxx()
DataOuutputStream Data输出流
新增功能 : writeXxx()
注意: 读入与写出的顺序保持一致
读入数据的时候必须从源文件中读入,否则抛出异常 java.io.EOFException
Object流|对象流|引用数据类型流
字节流的功能流
ObjectInputStream 反序列化输入流
新增方法 Object readObject() 从ObjectInputStream中读取一个对象。 等等
ObjectOutputStream 序列化输出流
新增方法 void writeObject(Object obj) 将指定的对象写入ObjectOutputStream。
序列化:
将对象数据转为可存储或者可传输的状态的过程
不是所有类型的数据都能序列化 java.io.Serializable
如果写出的对象类型没有实现序列化接口,会遇到运行时异常java.io.NotSerializableException
序列化与反序列化顺序保持一致
不是所有的属性都需要序列化 transient
static的成员不会被序列化
如果父类实现类序列化接口,子类所有内容都可以进行序列化
子类实现了序列化接口,只能序列化子类独有的内容
序列号:
当实现了序列化的类型默认存在一个序列号
当类中的成员发生改变,序列号默认会重新生成
作用: 使用序列号可以实现检查前后版本不一致问题
解决不同版本的兼容问题: 手动设置序列号
通过快捷键生成序列号:
1.类型必须实现了序列化接口
2.Setting中进行配置
3.双击类名alt+enter,自动生成序列号