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编码;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧