IO流

IO流概述

什么是IO流

io流就是内存和硬盘上完成对数据的读和写

 

I:Input

O:Output

通过IO可以完成硬盘文件的读和写

往内存中去,叫做输入(Input),或者叫做(Read)

从内存中出来,叫做输出(Output),或者叫做(Write)

 

流的分类

字节和字符

字节(Byte)是一种计量单位,表示数据量多少,它是计算机信息技术用于计量存储容量的一种计量单位

字符就是键盘上所有的符号,包括英文,汉字等

针对于每一个字符,都有固定的Ascll码与之对应,!占了一个字节,然后根据字节流读取数据的时候,读取的是!这个字符所对应的AscII码

像特殊符号、英文在java中占了一个字节,汉字在java中占了两个字节

 

有的流时按照字节的方式读取数据,一次读取1个字节byte,等同于一次读取8个二进制位

按照字符的方式读取数据的,一次读取一个字符,这种流是为了方便读取普通文本文件而存在的

字节流在读取数据的时候,会遍历文件中的字符,然后读取的是每个字符所对应的asII码

字节流可以读取任意类型的文件(普通文本,视频,录音,图片...)

在读取数据的时候,就是一个字符一个字符的进行读取,字符流的效率比较高,但是只能读取普通文本

 

输入和输出

java.io.InputStream 字节输入流

读取硬盘数据到内存

java.io.OutputStream 字节输出流

存储内存数据到硬盘

 

java.io.Reader 字符输入流

java.io.Writer 字符输出流

 

流的关闭

所有的都实现了java.io.Closeable接口,都是可关闭的,都有close()方法

 

所有的输出流都实现了java.io.Flushable接口,都是可刷新的,都有flush()方法

 

文件专属流

 

 

fileInputStream.read() 如果传了字符数组,那么返回的是读取的字符个数

FileInputStream这个字节流如何将ascII转成对应的字符

可以根据String这个类来完成

 

:第二次读取会对之前数组中已经存储的数据进行覆盖

读取数据

 

方法2:只适合小文件

写入数据

将字符串数据写入

开启写入追加(默认是false,覆盖写入)

 

字符输入输出流

 

注意点

 

缓冲流

缓冲流会将字节先写到一个缓冲区中,然后通过flush()或者关闭这个缓冲流来实现将缓冲流中的数据回显

特点:不需要创建数组

 

转换流

可以将字符流转换成字节流,也可以将字节流转换成字符流 InputStreamReader

包装流和节点流: new 流(new 流()) 外层是包装流,里面的是节点流

在关闭流对象的时候,只需要关闭最外层的包装流即可

 

数据流

 

数据流在写入数据到文件中的时候,要根据数据类型来写入,而且写入之后的文件是加密的,是我们看不懂的文件,如果想读取这些数据的话,只能通过数据输入流来读取

数据输入流在读取数据的时候,是要按照写入的顺序来读取,而且需要按照指定的数据类型来读取

存入数据流数据

按照存储的顺序读取加密数据

标准输出流

 

默认情况是我们经常使用的控制台打印,我们可以去改变输出流的输出方向

标准输出流的默认输出方向就是控制台

标准输出流以后适用的场景

可以去收集日志

比如说程序在某个时间点发生了某某异常,然后可以根据这个流来收集异常信息

或者去收集模块域模块之间的调用次数

 

异常日志收集工具类

 

对象专属流

java.io.ObjectInputStream

java.io.ObjectOutput

 

可序列化接口

写入的对象必须实现序列化的接口Serializable

 

 

序列化与反序列化

序列化

序列化就是将java对象写入到硬盘上,写入之后的文件也是加密的格式

 

反序列化

将文件中我们看不懂的加密数据读取出来,读取的就是java对象

 

 

 

 

 

对User类的对象进行序列化操作

 

对文件中存储的user数据进行反序列化操作

 

对多个对象进行序列化与反序列化(通过ArrayList来完成)

 

关于序列化版本号的问题

如果在反序列化之前修改了类中的代码,在类加载的时候会重新生成字节码文件,那么jvm给该类生成的序列化版本号就会改变,在反序列化时,旧的序列化版本号与新生成的版本号不对应,就无法完成反序列化

解决方案

我们可以在类中写死一个序列化版本号

 

禁止序列化关键字transient

transient可以使得某一属性不参与序列化的操作,在反序列化后会得到null值

 

JAVA I/O读取文件

读取文本文件

new BufferedReader(new InputStreamReader(new FileInputStream("a.txt"),"UTF-8"))