RandomAccessFile(随机访问文件):自身具备读写的方法。不是流体系中的成员。
特点:
1,随机访问。其实就是不断的改变指针的位置。从指定的位子进行读和写。
2,操作的是文件。
3,既能读,又能写。
4,该对象中维护了一个大型的字节数组,可以通过指针进行操作。
5,可以通过getFilePointer获取指针的位置,可以通过seek设置指针的位子。
6,该对象中维护了读取和写入的字节流。
要想随机访问,必须要数据有规律。因为他是通过确定指针的位置来用不同的访问的方法。如readInt,readByte
RandomAccessFile ra = new RandomAccessFile("c:\\random.txt","rw");
如果文件不存在,则会创建,如果文件存在,不覆盖。
writeInt();可以保证字节原样性。
他可以对数据进行修改,而不覆盖文件。
通过下面的例子来说明下。
package com.itheima.io
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomAccessFileDemo {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
writeFile();
// readFile();
randomWrite();
}
/*
* 通过randomaccessFile类,完成个人信息的存储(姓名,年龄)。
*/
public static void writeFile() throws IOException {
// 1,创建RandomAccessFile对象。明确具体的文件,和具体的模式。rw.
/*
* 如果文件不存在,则会创建, 如果文件存在,不会覆盖。
*/
RandomAccessFile raf = new RandomAccessFile("random.txt", "rw");
raf.write("张三".getBytes());
raf.writeInt(97);
raf.write("旺财".getBytes());
raf.writeInt(99);
raf.write("小明".getBytes());
raf.writeInt(102);
raf.close();
}
public static void readFile() throws IOException {
// 定义对象读取文件。
RandomAccessFile raf = new RandomAccessFile("random.txt", "r");
// 设置指针的位置,通过seek方法。一组加起来就是八个字节。8*0表示0位置的张三,8*1表示第二个我们存储的李四。。。而不能像你那样直一次性获得,
raf.seek(8 * 2);
// 获取一下文件指针
System.out.println("pos:" + raf.getFilePointer());
byte[] buf = new byte[4];
// 读取四个存储到buf中。为什么是四个了,因为我们用的编码是GBK,一个汉字占两个字节。两个汉字占四个。而且Int类型的数也是占四个字节。
//所以每四个一起编译就不会产生错误
raf.read(buf);
String name = new String(buf);// 字节数组转成字符串。
System.out.println("pos:" + raf.getFilePointer());
int age = raf.readInt();
System.out.println(name + ":" + age);
System.out.println("pos:" + raf.getFilePointer());
raf.close();
}
// 随机写。
public static void randomWrite() throws IOException {
RandomAccessFile raf = new RandomAccessFile("random.txt", "rw");
raf.seek(8*5);
System.out.println("pos:"+raf.getFilePointer());
raf.write("哦也".getBytes());
raf.writeInt(113);
raf.close();
}
}
|