Java IO流 --- 随机读写流1

文章目录

        • 1 概述
        • 2 写方法
        • 3 随机读取
        • 4 随机写入 细节

1 概述

RandomAcessFile

随机访问文件,自身具备读写的方法
通过 skipBytes( int x), seek( int x) 来达到随机访问

特点:

1 即可读取,又可以写入
2 内部维护了一个 大型的byte数组,通过对数组的操作完成读取和写入
3 通过getFilePointer()方法 获取指针的位置,还可以通过 seek()方法 设置指针的位置
4 该对象的内容封装了 字节输入流 和 字节输出流
5 该对象只能操作文件 — 文件包括文本文件和媒体文件

通过seek方法操作指针,可以从这个数组中的任意位置上进行读和写,可以完成对数据的修改
但是要注意:数据必须有规律

2 写方法

writeBytes(String s) : 按字节序列将该字符串写入该文件

该字符串中的每个字符均按顺序写出,并丢弃其高八位

write(byte[] b) : 将 b.length 个字节从指定 byte 数组写入到此文件
writeInt : 按四个字节将 int 写入该文件,先写高字节

使用RandomAccessFile对象写入一些人员信息,比如姓名和年龄

// 如果文件不存在,则创建,如果文件存在,不创建
// 但是,不是覆盖原来的文件,如果从头写,会覆盖原来的数据,从尾部写,根据指针的位置,直接追加到后面
RandomAcessFile raf = new RandomAcessFlie("raf.txt");

raf.write("张三".getBytes());
raf.write(97); // 输出 a  把数据写硬盘上,记事本解析这个信息 97对应a,但是读的时候还是97
raf.write(609); // 输出 a ,  write,只写最低的字节,丢弃其高八位
raf.witeInt(609); // 输出 张三  -a ,两个空格,一个-,一个a
raf.writeInt(97); // 保证 原字节数不变 张三   a  3个空格,一个a,
// 记录的数据是正确的,记事本解析不出来,是记事本的问题
// 哪怕解析出来是乱码也无所谓,调用相应的读方法,读出来的数据是正确的

raf.write("小强".getBytes());
raf.writeInt(99);

	raf.close();

3 随机读取

getFilePointer() ,通过这个方法,获取到指针的位置
seek() ,通过seek设置指针的位置
seek 想从哪儿读,从哪儿读 ,通过 getFilePointer获得指针的位置,通过seek实现随机读取

RandomAccessFile raf = new RandomAccessFile("raf.txt", "r");
//通过seek设置指针的位置。--- 直接读第二个人的信息
// 第一个人 姓名 年龄 占 8个字节,一个中文 两个字节。年龄Int,4个字节
raf.seek(1*8);//随机的读取。只要指定指针的位置即可
byte[] buf = new byte[4];
raf.read(buf); 
//  姓名是4个字节 --- 把前4个变成数组,并变成数组,解析出来,就是张三,因为是用 GBK解析的
// 先读 4个字节,读取名字,然后把名字存到 String字符串,打印看一下
String name = new String(buf);
int age = raf.readInt(); // 读年龄,年龄是 4个字节,年龄读出来应该是整数
readInt() ; // 直接读 4个字节,并变为整数

// 写的话,用记事本打开,会显示 a b ,,, 不管它显示什么,用相应的方法,读出来,数据是正确的
System.out.println("name="+name);
System.out.println("age="+age);
System.out.println("pos:"+raf.getFilePointer()); // 通过这个方法,获取到指针的位置
raf.close();

4 随机写入 细节

随机读取流的精髓就两点:随机读取,数组

内部维护了一个 大型的byte数组,通过对数组的操作完成读取和写入,下面讲讲数组
张三 97 小强 98 内存情况
指针通过数组的角标操作数组
Java IO流 --- 随机读写流1_第1张图片

main(){
RandomAcessFile raf = new RandomAcessFile("raf.txt",rw);
raf.seek(3*8); // 随机读取
raf.write("哈哈".getBytes());
raf.writeInt(108);
raf.close();
}

关于随机读取与相关的 数据必须有规律
raf.seek(3*8); // 往指定的位置写数据
随机读取与断点续传原理

如果直接从 0角标开始写,会覆盖张三的姓名,年龄等数据,但是如果角标在已有文件的后面,就不会创建新文件,而是在原来的基础上写,这就是可以 断点续传 的原理
普通的读写都是从头开学的,而 随机读写流,支持从角标的位置,也就是任何地方开始写,为断点续传提供了必要条件

随机读取,要求,数据必须有规律

现在姓名是,张三,李四,哈哈,都是两个字,如果换成 张小三,李小四等3个字的名字,或者复姓等更多字的名字时,只能读到前两个字,后面的读不了。
怎么办?自己创造规律
用 16个字节表示一个中国人的姓名,4个字节,表示年龄,用 20个字节表示一个人的姓名年龄信息,数据既有规律,还能满足要求

你可能感兴趣的:(Java,IO)