IO API
RandomAccessFile类:
- 可以操作文件的内容
- 按照字节操作,字节流
- read读和write写都是此类中的api方法
- 能够通过seek方法可以随意移动和改动文件的指针
RandomAccessFile类对文件的随机访问方式有两种
- 只读模式(“r”)
- 读写模式(“rw”)
创建对象
- RandomAccessFile(File file,String mode);
创建从中读取和向其中写入的随机访问流
文件通过File指定
模式通过String来指定 - RandomAccessFile(String file,String mode);
创建从中读取和想其中写入的随机访问流
文件通过String指定
模式通过String来指定 - mode的取值
"r"只读模式 read
"rw"读写模式 read write
写入操作
- void write(int d);
此方法会根据当前的指针所在的位置写入一个字节
- void write(byte[] d)
此方法会根据当前的指针所在的位置处写入一组字节
- void write(byte[] d,int offset,int len)
将len个字节从值得顶的byte数组写入文件,并从偏移量offset处开始
读取操作
- int read()
从文件中读取一个byte字节,填充到整形的额低八位中
如果返回-1,说明读取到文件的末尾 EOF end of file
- int read(byte[] b)
从指针指向的位置开始读取若干字节,存储到字节数组中,将读取到的字节按照顺序放在字节数组的相对应的位置,返回值为读取到的字节数,也可以说成读入到的长度,返回值为-1,则读取到文件的末尾
- int read(byte[] d.int offset,int len)
将最多len个数据字节从文件中读入byte数组中,并从偏移量offset开始存储
其他api
- void getFilePointer()
返回此文件中当前的偏移量 - void seek(long position)
设置到此文件开头0到文件指针的偏移量,在该位置发生下一个读入或写入操作 - int skipBytes(int n)
用此方法可以跳过一些少量的字节,可以正数,但不可以负数
字节流
- 字节流:可以从或向一个特定的方向读写数据,数据是字节
- 封装流/处理流:针对自接力进行封装,即对一个已经存在的流进行封装,通过所有的封装流能够对数据更有效的读和写,封装流底层还是字节流
- 通常字节流被称之为低级流
- 处理流被称之为高级流或过滤流
InputStream
InputStream是所有的字节流的父类,其定义了基础的读取方法
- int read()
读取一个字节,以int的形式返回,该int的低八位有效
否则返回-1,表示文件末尾EOF end of file - int read(byte[] b)
尝试最多读取给数组length个字节,并存入该数组
返回值为实际读取的字节量的长度,否则返回-1,到文件末尾 - int read(byte[] b,int offset,int len)
将输入流中的最多len个数据写入byte数组
将从offset位置开始写入数组,len不能超过数组的长度
如果超过会报数组的下标越界异常 - void close();
关闭此流,并示范与该流关联的所有的系统资源
OutputStream
是所有的字节流的父类,其定义了基础的写出写法
- void write(int d)写出整型数据的低八位
- void write(byte[] b)将给定的字节数组的数据全部写出
- void write(byte[] b,int offset ,int len)将给定的字节数组从偏移量offset开始的len个字节写入输出流
- void flush() 刷新此输出流并强制写出所有的缓冲的输出字节
- void close() 关闭此输出流并释放与此输出流有关的所有的系统资源
FileInputStream:文件输入流
- 可以操作文件的内容
- 操作的是字节流
- 记仇InputStream抽象类
- 低级流
- 操作的是文件
FileOutputStream:文件输出流
- 可以操作文件的内容
- 操作的是字节流
- 继承自OutputStream抽象类
- 低级流
- 操作的是文件
缓冲流:Buffer缓冲 高级流之一
-
缓冲流的原理:
相应键存储设备操作数据导致增大和硬件的交互次数
会降低读写的速度,做缓冲流的目的就是为了尽量减少和硬件的交互次数 -
缓冲输出流原理:
BufferedOutputStream缓冲输出流内部会维护一个缓冲区
每当我们想该流写出数据时,都会先将数据存入缓冲区
当缓冲区已满时,缓冲流会将数据一次性写出 -
注意:
void flush(),清除缓冲区,将缓冲区中的数据强制写出以保证数据完整 -
缓冲输入流原理:
BufferedInputStream缓冲输入流,内部会维护一个缓冲区
每当我们想向该流读入数据时,都会先将数据存入缓冲区
当BufferedInputStream的read方法会从缓冲区读取数据
当缓冲区全部读取完毕,如果再次read的时候,会再一次把缓冲区填满
read在注意从缓冲区中读取数据,以此往复 -
缓冲是靠牺牲内存来提升IO的读写效率
-
对象流:高级流之一,把内存的对象数据,序列化到硬盘上,也可以把硬盘上的文件反序列化到内存的对象
-
序列化:把内存的对象序列化到硬盘上,一字节的方式体现
-
反序列化:把硬盘上的字节序列反序列化会内存中的对象
-
比如:
Student stu=new Student("张三",20,"S001");
stu-->硬盘上(序列化)-->内存堆中出现stu对象(反序列化)
注意
如果要实现对象的序列化和反序列化
就必须对序列化的对象所对应的类实现java.io.Serializable接口
且类中最好给提供一个,long类型的序列化的版本号
比如:
``
public class Student implements Serializable{
private static final long serialVersionUID=1L;
filled 属性
method 方法
}