RandomAccessFilel类的实例化及主要方法

IO->输入/输出 读/写
对文件进行【随机】读写的类(不算IO,IO都是单向的,只能读或者只能写)

RandomAccessFile(可读可写) 属于java.io包

1.实例化

new 对象(场景:文件复制,文件的加密)
new RandomAccessFile(“文件名”,“模式”);
1.简化成直接使用文件名构造RandomAccessFile
new RandomAccessFile(“c.txt”,“rw”);
2.使用file对象构建RandomAccessFile
new RandomAccessFile(new File(“c.txt”),“rw”);

2.常用API

字节为单位
写 -write*3(重要)
write(b)写入指定int值的低八位,单字节
注意:写入的是字节,看到文件的内容是字符
字节->字符需要编码

编码实现:
public void write() throws IOException  {
RandomAccessFile rf=new RandomAccessFile("e.txt","rw");//toString没有重写
//文件不存在时,创建新的文件
//文件存在时,在原文件上覆盖
//1个字符 2个字节 16位
rf.write(1);//0000000 00000000 00000000 00000001 原码
//写入 00000001 ->1
rf.write('a');//97 在一个字节127的范围内,
rf.write(256);//00000000 000000001 00000000 0000000 原码
//写入0000000->0
rf.write(128);//(正数)00000000 00000000 00000000 10000000原码 
//写入1000000->128
rf.write(-1);//(负数)10000000 00000000 00000000 00000001原码
//11111111 11111111 11111111 111111110 反码
//11111111 11111111 11111111 111111111 补码
//最后写入低八位11111111 ->255

}

write(bs)写入指定的byte数组

编码实现:
public void  write02() throws IOException {
RandomAccessFile rf=new RandomAccessFile("f.txt","rw");
String word="天秀";
byte[] bs=word.getBytes();//字符串拆分成字节数组
rf.write(bs);
}

public void read02() throws IOException {
RandomAccessFile rf=new RandomAccessFile("f.txt","rw");
byte [] bs=new byte[6];
rf.read(bs);
System.out.println(Arrays.toString(bs));
String word=new String(bs);//字节数组变为字符串
System.out.println(word);
}
运行结果:
[-27, -92, -87, -25, -89, -128, -27, -68, -70, -27, -109, -91]
天秀强哥

wrtie(bs,offset,len)
void write(byte[] b, int off, int len) 截取一部分字节写入
从指定的字节数组写入 len个字节,从偏移量 off开始写入此文件。

编码实现:
       @Test
public void  write03() throws IOException {
RandomAccessFile rf=new RandomAccessFile("f.txt","rw");
String word="天秀强哥";
byte[] bs=word.getBytes();//字符串拆分成字节数组
rf.write(bs,3,6);//从下标3开始,截取长度6,读取秀强两个字,覆盖天秀,变成秀强强哥
}
@Test
public void read03() throws IOException {
RandomAccessFile rf=new RandomAccessFile("f.txt","rw");
byte [] bs=new byte[12];
rf.read(bs,0,12);//从头开始读,放入数组下标0,读长度12
System.out.println(Arrays.toString(bs));
String word=new String(bs);//字节数组变为字符串
System.out.println(word);}
运行结果:
[-25, -89, -128, -27, -68, -70, -27, -68, -70, -27, -109, -91]
秀强强哥

write 8种数据类型

读 -read*3-> 返回-1表示读到文件末尾
read()->读1个字节,存入到int类型低八位
从该文件读取一个字节的数据。
read(bs)->读bs.length个字节,并且存入到bs 中
从该文件读取最多 b.length字节的数据到字节数组。
read(bs,off,len)->读len个字节,并且存入到bs中,从off位置开始,返回读取出来的有效字节个数

文件的复制(数组):
@Test
public void copy() throws IOException {
RandomAccessFile raf1=new RandomAccessFile(“arrays_sort.pdf”,“rw”);//被复制的文件
RandomAccessFile raf2=new RandomAccessFile(“copy.pdf”,“rw”);//新文件
byte [] bs= new byte[1024];
int len=-1;
while ((len=raf1.read(bs))!=-1) {//raf1.read()返回的是读的字节的长度 len初始值是-1 如果是-1的话表示读到文件末尾
raf2.write(bs,0,len);
}

}

[读和写指针位置都会移动!]

文件加密:
字符串进行加密:
public void test() {
String str=“哈喽你好”;
byte [] bs=str.getBytes();
//每一个字节都进行加密 + - * 都会存在越界问题,/会存在不整除问题
//使用 ^ | &
for(int i=0;i<bs.length;i++) {
bs[i]^=12;
}
String newStr=new String (bs);
System.out.println(newStr);
for(int i=0;i<bs.length;i++) {
bs[i]^=12;
}
String newStr1=new String (bs);
System.out.println(newStr1);
}
文件加密(字节):
public void test02() throws IOException {
RandomAccessFile raf=new RandomAccessFile(“f.txt”,“rw”);

int b=-1;
while((b=raf.read())!=-1) {
	b^=12;
	raf.seek(raf.getFilePointer()-1);
	raf.write(b);
}
}

文件加密(数组):

@Test
public void test03() throws IOException {
RandomAccessFile raf1=new RandomAccessFile("f.txt","rw");
byte [] bs= new byte[1024];
int len=-1;
while ((len=raf1.read(bs))!=-1) {//raf1.read()返回的是读的字节的长度 len初始值是-1 如果是-1的话表示读到文件末尾
	for(int i=0;i<len;i++) {
	bs[i]^=12;//进行加密,,需要将数组内的每个元素进行加密,循环一次是read一个len长度的数组
	}
	raf1.seek(raf1.getFilePointer()-len);//len是读取的有效长度,将指针移回读取之前的位置
	raf1.write(bs,0,len);//写入加密后的元素
}

}

指定指针位置 Pointer
1.获得当前指针位置
long getFilePointer()
2.跳过对应字节数->顺序
skipBytes(num);
3.跳转到指定指针位置
seek(index)
实现读写同时操作
@Test
public void Pointer() throws IOException {
RandomAccessFile raf=new RandomAccessFile(“f”,“rw”);
long index=raf.getFilePointer();//得到指针的初始位置下标
System.out.println(index);
raf.write(1);
index=raf.getFilePointer();//得到指针的下标
System.out.println(index);
raf.write(“哈哈”.getBytes());//将字符转换成字节数组
index=raf.getFilePointer();//写入"哈哈"后,指针的位置
System.out.println(index);
//写入一个或多个字节后 指针的位置均会移动
raf.seek(1);//将指针的下标跳转,此方法无返回值
int b=raf.read();//读1个字节
System.out.println(“读单字节结果:”+b);
raf.skipBytes(2);
b=raf.read();
System.out.println(“第二次读单字节结果:”+b);

}
运行结果:
0
1
7
读单字节结果:229
第二次读单字节结果:229

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值