IO常用流
IO流
-
IO流共涉及40多个类,都是由这4个类派生出来的;
抽象基类 字节流 字符流 输入流 InputStream Reader 输出流 OutputStream Writer -
常用子类
- FileInputStream 和 FileOutputStream:文件输入流;
- FileReader 和 FileWriter【FileWriter 使用后必须要关闭close,或者flush,否则写入不了指定的文件】;
-
BufferedInputStream:缓冲字节输入流;
-
ObjectInputStream:对象字节输入流;
-
节点流:从一个特定的数据源读写数据,特定数据源:
- 文件【FileReader FileInputStream】,数组,管道,字符串;
-
处理流:是“连接”在已存在的流【节点流或处理流】之上,为程序提供更为强大的读写功能【BufferedReader BufferedInputStream内部分别含有一个 Reader和InputStream的属性】;
- 可以将节点流的对象传入处理流,进行新建处理流对象;
节点流和处理流的区别和联系:
- 节点流是底层流,直接与数据源相接;
- 处理流,可以对具有相同父类的节点流进行包装,使用了修饰器设计模式,不会直接与数据源相连;
- 处理流,增加缓冲的方式,提供一次输入输出大批量数据;
对象处理流
- 序列化:在保存数据时,保存数据的值和数据类型,对于对象数据,会将包路径一同保存【涉及到访问权限问题】,不是纯文本,文件后缀名:.dat;
- 反序列化:在恢复数据的时候,恢复数据的值和类型,读取的顺序必须和保存数据的顺序一致,而且对象默认为Object,需要向下转型;
对象支持序列化机制,必须实现如下两个接口之一:
- Serialiable:标记,声明接口,没有任何;
- Externalizable:继承了Serialiable 接口;
处理流:
-
ObjectOutputStream:提供序列化功能;
-
ObjectInputStream:提供反序列化功能;
-
注意事项:
-
读写顺序要一致;
-
要求序列化或反序列化对象,需要实现Serializable
-
是序列化的类中建议添加:
private static final long serialVersionUID = 1L; //对象重新加入一个属性的时候,不会认为是一个新类,而是一个更新版本,可以提高兼容性; -
序列化对象时,默认将里面所有属性都进行序列化,但是除了static 或transient修饰的成员;
-
序列化对象时,要求里面属性的类型也需要实现序列化接口;
-
序列化,具有可继承性,一个类实现了序列化,其子类也已经默认实现了序列化;
-
标准输入输出流:
| 属性 | 类型 | 默认设备 |
|---|---|---|
| System.in | InputStream | 键盘 |
| system.out | PrintStream | 显示器 |
- System.in:编译类型时InputStream,运行类型是BufferedInputStream;
- System.out:编译类型时PrintStream,运行类型是PrintStream;
转换流:
-
默认读取文件是按照“UTF- 8”,当编码不是时,字符读取会产生乱码问题;
-
由字节流读取,然后通过指定编码方式将字节流转化为字符流,
-
InputStreamReader:继承的Reader类,传入的是InputStream对象;
-
OutputStreamWriter
InputStreamReader isr = new InputStreamReader(new FileInputStream(file), 'utf-8'); BufferedReader br = new BufferedReader(isr); //底层是FileInputStream,然后包装了两个类: //1.InputStreamReader:用来指定字节流转化为字符流的编码格式; //2.BufferedReader:用来提高去读效率;
-
打印流:只有输出,没有输入流
-
PrintStream:继承FilterOutputStream,
Sys.setOut(new PrinStream(file)); //修改打印位置;由显示器更改到file位置; //setOut内部有一个native的setOut0(); -
PrintWriter:继承Writer;
Properties类
-
专门读取配置文件,继承:Hashtable类;
- 格式:键=值
-
键值对不需要有空格,值也不需要引号,默认类型是String;
-
常用方法:
load(); //加载; list(); //将数据显示到指定设备或流; getProperty(key); //根据键获取值; setProperty(key, value); //添加,覆盖; store();// 将Propertier中的键值对存储到配置文件中,如果有中文,会存储为unicode编码;

浙公网安备 33010602011771号