IO流—>功能流
Buffered缓冲流
Buffered缓冲流 -----> 功能流(节点流)
作用:提高节点流的读写效率,增强性能
分类
字节缓冲流:
字节输入缓冲流 BufferedInputStream
字节输出缓冲流 BufferedOutputStream
注意:没有新增方法,可以使用多态构建流
字符缓冲流:
字符输入缓冲流 BufferedReader
字符输出缓冲流 BufferedWriter
新增功能:
- 字符输入缓冲流:String readLine() 读一行文字
- 字符输出缓冲流 :void newLine() 写一个行分隔符。如果不想使用该方法换行则需要用(\n\r)
注意:该缓冲流有新增方法,如要使用新增方法,不能使用多态构建流
Data基本数据类型流
Data基本数据类型流 ------> 字节流的功能流
作用:能够读写带有数据类型的数据(要求: 基本数据类型|字符串)
基本数据类型输入流:DataInputStream
新增方法:readXxx(); -----》Xxx表示数据类型
基本数据类型输出流:DataOutputStream
新增方法: writeXxx(); -----》Xxx同上
注意事项:
不能发生多态
写出时的数据及类型要与输入时保持一致
异常:EOFException
当读入的不是写出时的源文件遇到异常| 源文件存在改动遇到的异常
public static void main(String[] args) throws Exception {
readData("D://xxxxxxx.txt");
}
//写出带出基本数据类型的数据
public static void writeData(String path) throws IOException {
//1.创建流
DataOutputStream os = new DataOutputStream(new FileOutputStream(path));
//2.准备数据
int i = 101;
boolean flag = false;
char ch = 'a';
String str = "zhangsan";
//3.写出到文件
os.writeInt(i);
os.writeBoolean(flag);
os.writeChar(ch);
os.writeUTF(str);
//4.刷出
os.flush();
//5.关闭
os.close();
}
//读入带有基本数据类型的数据
public static void readData(String path) throws Exception{
//1.创建流
DataInputStream is = new DataInputStream(new FileInputStream(path));
//2.从文件读入数据
int i = is.readInt();
boolean flag = is.readBoolean();
char ch = is.readChar();
String s = is.readUTF();
//3.处理数据,控制台打印
System.out.println(i+"-->"+flag+"-->"+ch+"-->"+s);
//4.关闭
is.close();
}
Object流
Object 流 | 对象流 | 引用数据类型流------->字节流的功能流
作用:可能读写数据保留数据的数据类型(引用数据类型|基本数据类型)---------使用基本数据类型时会发生自动装箱,变为对应的引用数据类型
新概念:
序列化:将对象类型的数据转为一个可以存储|可以传输的过程
反序列化:反转状态(转为java中的对象格式)
输入输出:
反序列化输入流:ObjectInputStream
新增方法:
Object readObject()
从ObjectInputStream中读取一个对象
序列化输出流:ObjectOutputStream
新增方法:
void writeObject(Object obj)
将指定的对象写入ObjectOutputStream
序列化的类型默认存在一个serialVersionUID,根据成员的修改会更新控制每次修改内容前后序列号统一,所以要自己写一个serialVersionUID或者可以用idea工具生成,用以控制版本得统一性
idea工具生成:
- 实现Serializable接口
- 设置Setting中配置
- 选中类名 alt+enter按钮
private static final long serialVersionUID = 3554186854453891043L;
使用Object流注意事项:
- 先序列化后反序列化
- 读入与写出的顺序要保持一致
- 不是所有类型的数据都能够序列化 实现一个空接口 java.io.Serializable
- 不是所有的属性都需要序列化 transient修饰
- 静态的变量不会序列化
- 父类有实现序列化接口,子类可以序列所有成员
- 子类实现了序列化接口父类没有实现,子类只能序列化自己独有的内容
集合
集合|容器:用来存储多个数据
集合与数组之间的区别
集合与数组都能存储多个连续数据
区别:
数组的特点:
- 数组是一个引用数据类型
- 定长,长度一旦确定不可改变
- 存储任意类型的数据,存储数据的类型要求一致
- 有序,有索引|下标(从0开始)
集合:
- 可以随着数据的增删容量进行改变
- 存储任意引用类型的数据
Collection<E>
Interface Collection<E>
集合层次结构中的根接口。 集合表示一组对象,称为其元素
子接口:
Set:无序,元素不能重复
List:有序,元素可重复----->ArrayList***
接口|规范:
添加 add
删除 remove
记数 size
包含 contains
清空 clear
是否空 isEmpty