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();