- 作用:可以很方便的读写文件内容
- 计算机的硬盘在保存数据时都是byte by byte的(字节挨着字节)。
- RandomAccessFile打开文件模式:
rw:打开文件后可进行读写操作
r:打开文件后只读
- RandomAccessFile写入读取的方法:
write(int data):写一个字节,写这个int值的低八位
write(byte[] data):将一组字节写入。
int read():读取一个字节,若已经读取到文件末尾返回-1。
int read(byte[] buf):尝试读取buf.length个字节。并将读取的字节存入buf数组。返回值是实际读取的字节数。
- RandomAccessFile是基于指针进行读写操作的指针在哪里就从哪里读/写。
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Arrays;
/**
* RandomAccessFile读写文件。
*/
public class RandomAccessFileTest {
public static void main(String[] args) {
try {
/**
* 向文件.\data.dat中写数据
* 步骤:
* 1、创建一个File对象用于描述该文件
* 2、不存在则创建该文件
* 3、创建RandomAccessFile,并将File传入。
* 使RandomAccessFile对File表示的文件进行
* 读写操作
* 4、向文件中写入内容
*/
//1
File file = new File("data.dat");
//2、不存在则创建该文件
if (!file.exists()) {
file.createNewFile();
}
//3、对file文件可以进行读写操作
RandomAccessFile raf =new RandomAccessFile(file,"rw");
//4、写一个int最大值
/**
* 2位16进制代表一个字节(8位2进制)
* 1位16进制代表4位2进制 f==1111
* 4字节代表32位2进制
*
* write(int)写一个字节
* 7f ff ff ff
* 01111111 11111111 11111111 11111111
*
* 00000000 00000000 00000000 01111111 00 00 00 7f
* 00000000 00000000 01111111 11111111 00 00 7f ff
* 00000000 01111111 11111111 11111111 00 7f ff ff
* 01111111 11111111 11111111 11111111 7f ff ff ff
*/
int i = 0x7fffffff;//int最大值
//写int值最高的8位
raf.write(i>>>24);//00 00 00 7f
raf.write(i>>>16);//00 00 7f ff
raf.write(i>>>8);//00 7f ff ff
raf.write(i); //7f ff ff ff
//定义一个10字节数组
byte[] data = new byte[]{0,1,2,3,4,5,6,7,8,9};
//将这10个字节全部写入文件
raf.write(data);
//写到这里,当前文件应该有14个字节了
/**
* 写字节数组的重载方法
*write(byte[] data,int offset,int length)
* 从data数组的offset位置开始写,连续写length个字节到文件中。
*/
raf.write(data,2,5);//{2,3,4,5,6}
System.out.println("当前指针位置:"+raf.getFilePointer());//19
raf.seek(0);//将指针移动到文件开始的位置
System.out.println("当前指针位置:"+raf.getFilePointer());//0
/**
* num:00000000 00000000 00000000 00000000
*/
int num = 0;//准备读取的int值
int b = raf.read();//读取第一个字节 7f
System.out.println("当前指针位置:"+raf.getFilePointer());//1
num = num|(b<<24);//01111111 00000000 00000000 00000000
b = raf.read();//读取第二个字节 ff
num = num|(b<<16);//01111111 11111111 00000000 00000000
b = raf.read();//读取第三个字节 ff
num = num|(b<<8);//01111111 11111111 11111111 00000000
b = raf.read();//读取第四个字节 ff
num = num|b;//01111111 11111111 11111111 11111111
System.out.println("int最大值"+num);//int最大值2147483647
raf.seek(0);
byte[] buf = new byte[1024];//1k的容量
int sum = raf.read(buf);//尝试读取1k的数据
System.out.println("总共读取了"+sum+"个字节");
System.out.println(Arrays.toString(buf));
raf.close();//写完了不再写了就关了
}catch(IOException e){
e.printStackTrace();
}
}
}
网友评论