1、前言
文件是什么:
文件中存储的是数据
任何文件都是有byte数据组成的有序的数列
byte数据:是文件的最小(原子、不可在分)单位
2、创建对象
1)new RandomAccessFile(File file,String mode)
2)new RandomAccessFile(String filename,String mode)
解析RandomAccessFile构造方法参数:第一个参数是需要访问的文件,而第二个参数则是访问模式
访问模式(mode) |--”r” 只读模式 若文件不存在,会抛FileNotFoundException (系统找不到指定文件)
|--”rw” 读写模式 若文件不存在,会自动创建
若设置为读写模式该文件的访问就是即可读又可写。
3、字节数据读写操作
2.1 、void write(int d)方法:该方法会根据当前指针所在位置写入一个字节。是将参数int的“低8位”写出。
2.2、int read()方法:该方法会从文件中读取一个byte(8位)填充到int的低8位,高24位为0。返回值范围正 数:0~255。如果返回-1表示读取到了文件末尾!每次读取后自动移动文件指针,准备下次读取。
2.3、void write(byte[] d)方法:该方法会根据当前指针所在位置处连续写出给定数组中的所有字节。
2.4、void write(byte[] d,int offset,int len)方法:该方法会根据当前指针所在位置处连续写出给定数组中 的部分字节,这部分是从数组的offset的开始连续len个字节。
2.5、int read(byte[] b)方法:该方法会从指针位置处尝试最多读取给定数组的总长度,并从给定的字节数组第 一个位置开始,将读取到的字节顺序放置数组中,返回值为实际读取到的字节量。
2.6、close():RandomAccessFile在对文件访问的操作全部结束要调用close()方法来释放与其他关联的所有系 统资源。
/** 1)使用RandomAccessFile的write方法向文件raf.dat写入数字“1” */
/**2)使用RandomAccessFile的read方法从文件raf.dat中将数字“1”读取出来并打印到控制台
* @throws IOException */
@Test
public void testWrite() throws IOException{
RandomAccessFile raf =
new RandomAccessFile("raf.dat","rw");
//写出一个字节,写的是一个int值的低8位
raf.write(1);//(0000 0000 0000 0000 0000 0000) 0000 0001 省略前面24位
raf.write(-1);//(1111 1111 1111 1111 1111 1111)1111 1111 省略前面24位
raf.close();
}
@Test
public void testRead() throws IOException{
RandomAccessFile raf =
new RandomAccessFile("raf.dat","r");
//读取一个字节
int d;
while((d = raf.read())!=-1){
//1)d读取1: 0000 0000 0000 0000 0000 0000 0000 0001 读取raf中的一个字节
//赋值给int的型 前面就高24位就0填充。最终结果(10进制):1
//3)d读取-1: 0000 0000 0000 0000 0000 0000 1111 1111 。最终结果(10进制):255
System.out.println(d);
//2)d读取1: 0000 0000 0000 0000 0000 0000 0000 0001
//若以(2进制)形式打印出来 前面的0省略。最终结果:1
//4)d读取-1: 0000 0000 0000 0000 0000 0000 1111 1111 。最终结果:1111 1111
System.out.println(Integer.toBinaryString(d));
}
raf.close();
}
/**1)使用RandomAccessFile的write(byte[])方法向文件raf.dat写入字符串“HelloWorld”*/
/**2)使用RandomAccessFile的read(byte[])方法从文件raf.dat中将字符串“HelloWorld”取
* 出来并打印到控制台
* @throws IOException */
@Test
public void testWriteByteArray() throws IOException{
RandomAccessFile raf =
new RandomAccessFile("raf.dat","rw");
byte[] buf ="HelloWorld".getBytes();
raf.write(buf);
raf.close();
}
@Test
public void testReadByteArray() throws IOException{
RandomAccessFile raf =
new RandomAccessFile("raf.dat","r");
byte[] buf = new byte[10];
//len 最终值为读取的字节量
int len = raf.read(buf);
System.out.println("读取到了 :"+len+"字节");//读取到了:10字节
System.out.println(new String(buf));//HelloWorld
raf.close();
}
4、文件指针操作
3.1、long getFilePointe()方法:该方法获得当前RandomAccessFile指针位置,打开文件是默认指针位置在0。
3.2、void seek(long pos)方法:该方法移动当前RandomAccessFile的指针位置。
3.3、int skipBytes(int n)方法:该方法跳过输入的n个字节以丢弃跳过的字节。此3方法不出EOFException
(文件结束异常)。返回结果是跳过实际字节数。如果n为负数,则不跳过任何字节。
@Test
public void testGetFilePointer() {
try {
//创建RandomAccessFile 进行读写操作
RandomAccessFile raf = new RandomAccessFile("abc.txt","rw");
System.out.println(raf.getFilePointer());//0
raf.write('A');//'A' 占1个byte
System.out.println(raf.getFilePointer());//1
raf.writeInt(3);//3 占4个byte
System.out.println(raf.getFilePointer());//5
//将指针移动到文件开始处(第一个字节的位置)
raf.seek(0);
System.out.println(raf.getFilePointer());//0
//指针跳两个字节
raf.skipBytes(2);
System.out.println(raf.getFilePointer());//2
//访问完文件,释放资源
raf.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
}