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编码;
    
posted @   烟雨断桥  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示