随机访问流:
RandomAccessFile类不属于流,是Object类的子类。
但它融合了InputStream和OutputStream的功能。
支持对文件的随机访问读取和写入。
public RandomAccessFile(String name,String mode):第一个参数是文件路径,第二个参数是操作文件的模
mode:参数指定用以打开文件的访问模式。允许的值及其含意为:
值 |
含意 |
---|---|
"r" | 以只读方式打开。调用结果对象的任何 write 方法都将导致抛出 IOException 。 |
"rw" | 打开以便读取和写入。如果该文件尚不存在,则尝试创建该文件。 |
"rws" | 打开以便读取和写入,对于 "rw",还要求对文件的内容或元数据的每个更新都同步写入到底层存储设备。 |
"rwd" | 打开以便读取和写入,对于 "rw",还要求对文件内容的每个更新都同步写入到底层存储设备。 |
模式有四种,我们最常用的一种叫"rw",这种方式表示既可以写数据,也可以读取数据
首先,我们创建一个随机访问流,并写入数据
private static void write() throws IOException {
// 创建随机访问流对象
RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw"); // 可以写入任何类型数据
raf.writeInt(100);
raf.writeChar('a');
raf.writeUTF("中国"); raf.close();
}
再试下随机访问流的读取:
private static void read() throws IOException {
// 创建随机访问流对象
RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");//不管读写,这个代码都一样 int i = raf.readInt();
System.out.println(i);
// 该文件指针可以通过 getFilePointer方法读取,并通过 seek 方法设置。
System.out.println("当前文件的指针位置是:" + raf.getFilePointer());// char ch = raf.readChar();
System.out.println(ch);
System.out.println("当前文件的指针位置是:" + raf.getFilePointer());// String s = raf.readUTF();
System.out.println(s);
System.out.println("当前文件的指针位置是:" + raf.getFilePointer());//16,在6+3+3后,还读取了2个字节+2 = 16 // 如果只要读取a:
raf.seek(4);
ch = raf.readChar();//要清楚要读取的位置的数据是什么类型的,这里要对应类型的,否则会发现,输出的东西看不懂
System.out.println(ch);
}