Java基础之IO流(字节流)

Java基础之IO流(字节流)

前言

在前一章,我已经写了RandomAccessFile,它可以很好的进行对文件的操作,但是在我们的开发中,不会仅仅局限于对文件的操作,可能还会涉及到其他的数据源,比如键盘,网络等,这个时候就不能使用RandomAccessFile,就需要本章介绍的IO操作。

IO流

IO流即InputStream和OutputStream,这里的输入和输出是相对与程序本身的,输入就是去读取,输出即为写出,而不是我们生活中“请输入……”的概念。

流的分类

  1. 流按照流向的方向可以分为输入流和输出流,输入流负责读取,输出流负责写出。
  2. 流按照传输的数据单位可以分为字符流和字节流。
    上面的两组分类可以组合一下,即为:字符输入流Reader、字节输入流InputStream、字符输出流Writer、字节输出流OutputStream。这四个流就是java IO的四大基流。其他流都是继承于这四大基流的。注意,四大基流都是抽象类。
  3. 流按照功能分为节点流和处理流,节点流又称为低级流,它可以从一个地方(向一个地方)读写数据。比如FileInputStream。处理流又称为高级流,是对一个已存在的流进行连接和封装。封装后的流的功能可以简化我们的读写操作。处理流是不能单独存在的,他必须依赖于低级流,在他的构造方法中必须传入一个流作为参数。

常用流的介绍

  1. 文件流 FileInputStream/FileOutputStream
    文件输入流/文件输出流
    FileInputStream fis = new FileInputStream (“xxxx/xxxx.xx”);
    通过文件路径创建一个文件输入流
    FileInputStream fis = new FileInputStream (File file);
    通过文件创建一个文件输入流

因为FileInputStream/FileOutputStream继承于InputStream/OutputStream,而InputStream和OutputStream分别有read()和write();所以FileInputStream和FileOutputStream有一下
fis.read();读取
fis.write();写出
这两个方法的使用与RandomAccessFile的read()和write()一致。大家可以参考一下 RandomAccessFile.

文件流是一组低级流,在很多人学习的时候,可能只会接触这一种低级流,本章也只介绍这一组低级流。

  1. 缓冲流 BufferedInputStream/BufferedOutputStream
    缓冲字节输入流/缓冲字节输出流
    缓冲流是一组高级流,使用它们可以加快读写效率

缓冲流内部有一个缓冲区,当BufferedInputStream(后面使用bis)的read()读取一个字节时,实际上bis会一次读取一组字节,并存入内部的字节数组中,然后返回一个字节,当再次调用时会将字节数组中的第二个字节返回,直到字节数组中的所有字节都返回,才会再次读取一组字节。所以,缓冲流是靠减少读取次数提升读写效率的。
BufferedOutputStream(后面使用bos)有一个flush方法,他表示强制将缓冲区中的字节一次写出,应用于一些写出字节太少因此没有写出的情况,可以手动写出,当然了,在bos的close()方法中调用了flush()的。因此通过关闭流也可以实现写出。

  1. 对象流 ObjectInputStream/ObjectOutputStream
    对象输入流和对象输出流
    对象流是用来读写对象的,它可以将一个对象中的内容写出,或者读取数据写入一个对象中,但是对象流必须要求他操作的对象实现serializable接口,
    ois.readObject();
    oos.writeObject();
    注意:对象流的读写方法和其他的流不太一样。且writeObject将对象转为一组字节后写出,写出的内容大小比实际内容要大,是因为写出的除了内容外还有结构等信息。

对象输入流是对象反序列化读取一组字节并还原为对象,它所读取的字节必须是对象输出流oos对象序列化得到的字节。否在会抛出异常。
对象序列化:将对象转为一组字节的过程。
对象反序列化:将一组字节转为一个对象的过程。
对象持久化:将对象转换后的字节写入磁盘永久保存的过程。

transient关键字用来修饰属性,该类实例在使用oos序列化时,该属性会被忽略,达到对象“瘦身”的效果。

当一个类实现了serializeble接口后,应该添加一个常量:seriaVersionUID,它表示当前类的序列化版本号,不定义是由系统默认给出,但只要类的结构发生了改变,版本号就会改变,版本号影响反序列化的结果,当进行反序列化时,会检查对象和类的版本号是否一致,不一致则会抛出异常,一致则会反序列化成功,若结构已经改变了,则会采用兼容模式,能够还原的属性还是会还原,

结构图

这一次就发一张结构图来充当一下,哈哈哈哈
在这里插入图片描述
字符流的介绍就写在下一章吧……

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值