IO流

IO流介绍

在前面学习的程序中的数据最终都存到内存中, 这些容器可以存放数据 都是他们把数据存在内存中 一旦程序停止运行JVM退出。

那么给JVM奉陪的内存空间就消失了,在整个程序中的数据就没了

内存属于临时存储设备 断电 程序运行结束 内存释放,数据就消失了。

持久化存储设备: 数据可以在这类设备上长久保存,硬盘,U盘,光盘,磁带,云盘等。这些设备都可以长久的保存数据 当需要数据的时候 可以到这些设备上获取数据。

IO技术: 把程序中的数据最终输出到长久设备上,或者从长久设备读取已经存在的数据 最后给我们读取到程序中。

IO:input 输入 读操作 

  output 输出 写操作

注意: 所有的操作都是基于 计算机内存和文件之间的交互

把内存中的内容写到指定文件中 叫写 输出 拿出去

把文件中的内容弄到内存中叫读 输入 相当于读书一样 把内容读到内存中 拿进来

file类介绍:

介绍对文件的一系列操作

 

 

 字节流:

流的分类:

 

 

 InputStream

fileInputStream 是InputStream的常用子类

fileinputStream流被称为文件字节输入流(就是读 把内容读到内存里来) 意思是对文件数据及以字节的形式进行读取操作 如读取图片 音频等。

常用的方法构造方法有:FileinputStream(File file) 或 FileinputStream(String path)

int read(): 这个方法被调用一次 它运行一次 会从底层读取一个字节数据 当把这个字节读取完成之后 在文件中的隐式自动的移动到第一个字节和第二个字节之间 返回的数据是这个字节数据转成int值 当读取到文件的末位时 会返回-1 因此在使用read方法读取数据的时候 通过判断是否是-1来判断是否把文件中的数据全部读取完成。

int read(byte[] b): 这个方法每执行一次 就会从底层读取多个字节数据 把读取到的直接数据存储在byte数组中,返回的int值 是表示当前到底从垫层读取了几个字节数据

其实就是給byte数组中存储了几个字节数据 如果读取到文件的末位时 会返回-1

int read(byte[],int off,int len) off从哪里开始 读多少

void close() 关闭流 在使用完成之后 一定要关闭流 释放资源

字节读取文件模板:

1) 一次读取一个字节的模板代码:

 

 

 

 

 2)一次读取多个字节的模板代码

 

 

 

OutputStream(写 把内存中的内容写到指定的文件里面)

OutputStream: 是所有字节输出流的超类 并且是个抽象类 不能直接创建对象

写的方法:

write(int b):把字节数据直接写到长久化设备上

write(byte buf) 把直接数组中的数据写到持久化设备上

write(byte[] buf,int off,int len) 把buf数组中的数据从off下标开始共计写出len个字节数据

close() 关闭流 关闭java程序和外围设备直接的连接通道

FileOutputStream(File file):在创建输出流对象的时候 指定一个文件对象 用于把文件写到这个文件里面

FileOutputstream(String path):在创建输出流对象的时候 把这个字符串当前一个具体的文件地址 然后把数据写到这个文件中,在使用输出流的时候 如果指定的文件不存在 会自动创建这个文件 如果文件存在 会创建一个新的文件把原来的我就爱你覆盖掉。

字符流

java给我们提供了专门用于操作字符数据的流对象

字符输入流:Reader

字符输出流:Writer

一次读取一个字符的模板

 

 一次读取多个字符:

 

 Writer

Write常用的方法:

write(String str) 写一个字符串

write(String str,int off,int len) 把数组中的字符数据从off开始 共计写len个

void close() 关闭流

void flush() 刷新

注意:

用字符输出流写出数据的时候:

1)其实数据不是直接写到文件中 而是把字节数据存储在缓冲区中,如果这时字符输出流的缓冲区没有写满 或者我们没有调用flsh() 方法 或没有关闭流对象 在程序结束之前 数据依然在缓冲区中,不会被写到文件中。所以要求: 在关闭流之前一定要做刷新操作。

2) 字符输出流FileWriter 关联的文件如果不存在了 会在指定的位置新建 如果存在 在创建流对象的时候 没有指定的true值 这时会创建新的我就爱你覆盖原来的文件。

flush 和close有什么区别?

flush 是把缓冲区的数据刷出到文件中,没有关闭流和文件的关联 在刷新之后 依然可以使用流对象继续给文件中写数据。

close 方法在关闭流之前会先调用flush把缓冲区中的数据写到底层文件中 然后把流和文件的关联关系断开。

一旦调用close方法 流就被关闭了 就无法在使用当前这个流对象写数据了。

二进制流 就是用来操作图片和音频的

具体的操作如下:

 

 序列化和反序列化

序列化: 一个用于将对象状态转换为字节流的过程 需要使用对象输出;流 ObjectOutputStream

简单的说: 我们使用new关键字创建在内存中的对象 包括对象中的所有数据 持久性的保存到硬盘上 通常是文件

对象 ---> 文件

反序列化: 则是从头顶的流中获取数据重新构建对象的过程 需要使用对象的输入流ObjectInputStream

保存在文件中的对象通过反序列化的手段重新加载到内存中

具体操作如下:

 

 

注意: 创建的类要实现这个接口Serializable 不然会报异常

 

 

 

 

 

 

 

  1、一次读取一个字符数据:

   //定义字符输入流对象和文件进行关联

   FileReader fr = new FileReader("文件");

   //定义变量,存储读取到的字符数据

   int ch = 0;

   //使用循环读取数据

   while( ( ch = fr.read() )!=-1 ){

      //处理读取到的单个字符数据,数据在ch中保存着

   }

   //关闭流对象

   fr.close();

 

posted @ 2021-12-10 23:48  秃头少女and战战  阅读(40)  评论(0编辑  收藏  举报