I/O操作

综述

I/O操作是每个全场景编程语言都必须具备的一个功能性要求。

任何一个没有IO操作的算法都是不完整的。

但是I/O操作在具体底层实现的时候,会遇到各种使用环境和硬件,比如:键盘是输入,鼠标也是,文件读取也是;控制台打印是输出,文件输出,界面绘制输出。所以导致它的实现需要用到大量的底层和硬件驱动。所以,Java语言的设计者为了降低业务层程序员的开发难度,把所有的这些操作全部封装了,形成了Java的I/O操作。又通过各种使用性能的考量,设计成了三套I/O操作。 他们分别是:BIO NIO AIO

在目前的这个阶段,我们要学习的是BIO。

BIO中的流模型

在Java当中把IO操作设计成了一个统一的模型,也就是“流模型”。 这种模型讲输入和输出看成是两个端点之间建立一根管道,然后数据就像流水一样从数据源流向目的地。

数据源 ---> 管道 ---> 目的地

我们在实现的过程中,底层不用考虑,我们需要考虑的只是选择哪根合适的管道。也就是说所有的管道,底层实现它全部做了,我们选用就可以了。

管道的分类

一共有三种分裂: 1、根据传输方向进行分类: 输入流和输出流 注意:所有的输入还是输出永远站在程序的立场。

一旦确定了输入流,那么流模型中的目的地端点就是程序:

数据源 ---> 管道 ---> 程序

反过来,确定了输出流,那么流模型的数据源就是程序:

程序 ---> 管道 ---> 目的地

2、根据管道的粗细来进行分类: Java中提供了两种粗细的管道:字节流和字符流。字节流是字节(byte)为单位进行传递 ;字符流是字符(char)为单位进行传递。

在实际使用的时候,如果我们要传递文本信息,那么就要用字符流;如果我们要传递的是二进制信息,就用字节流。

注意:字节流也能传递文本信息,因为1个字符就是2个字节,只是说传递以后还要把他组合回字符,这个操作比较烦。

3、按管道的功能划分:节点流和操作流。 其中节点流的任务就是确定第2个端点到底是谁。输入流如果是节点流,那么它确定的是数据源是谁;输出流是节点流,那么它确定的是目的地是谁。 操作流主要的任务是用来在数据传递过程中执行某个操作任务的,它最大特点就是不能单独使用,必须对接节点流。

抽象的管道类

在Java的设计中,根据管道的第一种和第二种分类,两两组合,设计了IO流当中的4大父类。

InputStream -- 字节输入流 OutputStream -- 字节输出流 Reader -- 字符输入流 Writer -- 字符输出流

这四个类是4个抽象类,我们具体使用的时候要他们的子类。他们子类在命名上是有特征的,后半部分就是父类的名字,前半部分是另一个端点的名字(这种就是节点流,比如:FileInputStream),或者是要执行的特殊操作(这种就是操作流,比如:InputStreamReader)。

那么这种设计的好处在哪里呢? 不管有多少种应用子类,他们的操作方法都在共同父类中定义,然后各自去重写实现。而使用者不管关心具体的实现,用固定的方法就可以了。

所以,我们要掌握的IO流API的方法很简单: 输入流:read 输出流:write 用完流:close

具体使用IO流步骤

1、分析判断,到底要用什么管道。 先判断输入还是输出,再判断字节还是字符,再判断另一个端点是谁,从而选择到要用的管道子类。

2、产生管道 -- new

3、使用管道 -- read/write

4、用完以后 -- close

大家要有意识,只要用到I/O操作,一定有编译时异常,一定要用try-catch;而关闭动作要写到finally当中。

具体使用的演示,请产看上课代码。目前只要求各位掌握住文件的操作,包括3种情况: 1、把程序中的字符串信息写入到文本文件 ,FileWriter的使用;

2、把文本文件中的字符串信息读入到程序中,FileReader的使用;

3、把计算机中的任意一篇文件拷贝到本机的其他位置,FileInputStream和FileOutputStream的使用。 (面试中比较常见)

try-with-Resource

这是JDK7提供的功能,可以让我们简化我们的IO操作,避免程序员在开发过程中忘记关闭打开的管道或链接。

1、try-with-resource 是一个语法糖,它最终在还是被编译成了try-catch-finally,在finally里面关闭了我们的管道。

2、try-with-resource 只能在哪些需要关闭的管道操作或连接操作的时候使用,而不是任意的try-catch-finally都可以被替换。能够使用try-with-resource的管道必须实现一个AutoCloaseable的接口,然后重写这个接口的close方法。

关于更具体的内容请看我给的PDF资料。

对象的序列化和反序列化

对象的序列化:把程序当中的一个Java对象以二进制的形式输出;

对象的反序列化:把一个代表对象的二进制流读入到程序里面,自动生成为一个Java对象。

可以看到,这里的序列化概念和反序列化概念是与文件无关的。

对象序列化要用到的类:ObjectOutputStream

对象反序列化要用到的类: ObjectInputStream

注意:对象反序列化是各位同学学到的Java当中4种产生对象的第2种方式。

操作对象序列化和反序列化的要点: 1、参与序列化的类要实现Serializable接口;

2、ObjectOutputStream还是ObjectInputStream都不能单独使用,要进行管道对接。 因为它们是操作流,并不能确定流的另一个端点,只是在传输过程中完成对象和二进制流的转换操作。(这样的二进制又被称为对象流)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值