您的位置:首页 > 其它

RandomAccessFile:对文件随机访问

2014-07-13 10:36 411 查看


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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: