1.什么是IO流,IO流的作用是什么?
我们来思考一个问题,就是我们生活中聊天发送消息,在古代相当于什么?相当于驿站专员,专门用来邮寄双发信件。只不过新时代,我们可以通过上网来加快捷的发送信件等。但收发信件和聊天其本质也是一样的,都是要通过一种媒介方式来让双方收到信件
而古代就是驿站专员,现代就是IO流。
所以IO流其本质就是一种媒介,用来将双方需要的物品来交付给对方。简单来讲,你也可以将IO,理解成跑腿小哥,主要作用就是将物品等其他东西,传递给双方。
2.IO分为哪些状态
IO流,按照流的流向不同分为 输入流 和 输出流
输入流:就是将外部文件读取到程序当中。类似于我们喝水状态,也是将外部的资源流入到我们身体当中
输出流:就是将程序中的文件写入到外部资源当中(如:磁盘等)。相当于我们将水吐出来
按照数据的分类,分为字符流(二进制文件) 和 字节流(字符),你也可以理解为按照邮寄的物品类别
字符流:主要就是一些字符,字符串之类等
注意:在使用字符输出流时,只有关闭流,或刷新流时,才代表着将字符内容写如到程序当中,如过没有关闭或刷新流,就代表什么都没有写入到程序当中
字节流: 主要是视频,音乐,图片等
下面四个是IO流中所有流的父类
3.节点流 和 处理流/包装流的区别
节点流:就是该节点流只能用于操作某一特定类型的数据源,从该数据源进行读写文件。
比如:FileIputSetream 就只能用于操作文件的读取
你也可以理解为:节点流就如同家里遥控器一样,每种不同的流,就如同不同的遥控器。电视遥控器就只能操作电视,空调遥控器就只能操作空调。每一个特定的流就只能操作某一个类型的数据,而不同操作其他类型。
但由此就引出了另外一个问题,如果想要操作不同类型,就会特别麻烦。比如我需要看电视时,但身边电视遥控器没在,那么我就需要先找到电视遥控器,才能操作电视。而这种就特别麻烦,所以就出现了包装流
包装流/处理流: 就是相当于万能遥控器,可以直接使用一个遥控器来操作不同类型的家具,如电视,空调等。
包装流和节点流
常见的一些处理流/包装流有哪些?
缓冲流: BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter
对象流:ObjectInputStream ObjectOutputStream
一、对象类的作用是什么?
那么有人说我们用文本只需要将其粘贴不就可以具备了保存了吗?但其实并不是,如100,我们黏贴在文本内,那么我们可以知道是int或Sting类型,但计算器如何知道是什么类型呢,由此就有了对象流
对象流的作用就是保存 数据类型 和 数据类型的值。
二、对象流的使用细节:
1.在保存类对象时,最号在该类中写入 private static final long serialVersionUID = 1L;
这样其目的是为了,如果保存该类后,其IDEA中该类新添加了一些方法和属性时,将其已保存的对象导入进来时,不会报错
//serialVersionUID 序列化的版本号,可以提高兼容性 //当Dog类中添加新属性时,序列化或反序列化时,java不会认为Dog是个全新的类 private static final long serialVersionUID = 1L;
2.在已经保存的该类对象文本中,查看该类所在的位置,也就是在哪个包下,文件下。而在读取时,该类所在IDEA中所在的包位置 要和 已保存文本对象中位置一致。如下:该data就是已经保存了Dog类对象的文本
3.读写顺序要一致。也就是读取的时候哪个数据类型在前,哪个数据类型在后。都是要保持一致的
4.static或transient修饰的数据,则不会进行序列化。也就是static或transient修饰的数据值,在进行读取时,是读取不到该原本的数据值,只会显示为null
这是已经创建了含有nation属性和color,nation是 static修饰, 而color是 transient修饰
5.需要序列化的对象中,所有属性都必须继承或其父类有实现了 Serializable。
如图:Dog类中有 Master属性,这是自己所创建的类,如果Maste类没有实现Serializable,或者继承实现Serializable的父类,则在进行序列化时,会报错
6. 要求序列化或反序列化对象,必须实现Serializable 或 Externalizable 两者之一
7. 序列化接口具备可继承性。只要实现了 Serializable 或 Externalizable 的类型,其下所有子类或其子类的子类都可以进行序列化。如:如A 实现了可序列化接口,B继承A,master继承 B。那么B类和Maser类都具备可序列化
转换流
转换流的作用是什么?
当我们要读取某个文件时,如果该文件的编码格式与此刻默认读取的编码格式不一致就会出现乱码。如:IDEA默认读取文件是utf-8,而我们此刻读取到的文件格式是gtb,那么就会出现乱码抓状态
而转换流的作用就是读写某个文件时,指定其编码格式,这样就不会出现乱码状态
InputStreamReader OutputStreamWriter
InputStreamReader(InputStream, Charset):Charset编码格式,如果此刻我们要读取的文件是gtb格式,那么只有将读取文件的格式指定为gtb,才不会出现乱码
OutputStreamWriter(OutputStream, Charset)Charset编码格式,将文件写入到某个路径下,可以指定其保存下来的编码格式
Properties
一、Properties的作用是什么?
Properties是为了可以快速取到一些key和value值,因Properties大部分内容都是一些键值对的形式,那么虽然说我们也可以用其他方法来取到这些值,但用起来方式就太过于麻烦了,所以为了更加快速取到键值对,所以就有了properties。可以快速通过键来定位出值
注意:Properties其使用时,里面的参数也要放入一个节点流
如下:
传统方法获取user或pwd的信息
Properties方法来获取到键值对的信息
打印流
打印流只有输出流,没有输入流
PrintStream PrintWriter
PrintStream : 其父类是FileOutputStream类型,也就是OutputStream类型的子类
构造器又有三种常见使用方式:
1.可以传入任何OutputStream类型的子类
2.可以传入一个File类型
3.可以传入String类型,也就相当于文件路径
PrintStream 默认输出是在显示器,那么通过2,3就可以将内容输出到一个文件中
PrintWriter 字符打印流
PrintWriter 打印流 也是有常使用的三种构造器
1.可以传入任何一个Write类型的子类
2.也可以传入一个File文件类型
3.可以传入一个String类型
注意:使用 PrintWriter 写入时,和一般字符流是一样的,也需要close关闭流才可以将文件写入进去到磁盘等