IO->输入/输出 读/写
对文件进行【随机】读写的类(不算IO,IO都是单向的,只能读或者只能写)
new 对象(场景:文件复制,文件的加密)
new RandomAccessFile(“文件名”,“模式”);
1.简化成直接使用文件名构造RandomAccessFile
new RandomAccessFile(“c.txt”,“rw”);
2.使用file对象构建RandomAccessFile
new RandomAccessFile(new File(“c.txt”),“rw”);
字节为单位
写 -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
}
String newStr=new String (bs);
System.out.println(newStr);
for(int i=0;i
}
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
}
指定指针位置 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