意义
RandomAccessFile类是Java中操作文件内容功能最强大的类,既可以读,也可以写。
RandomAccessFile支持随机访问,可以直接访问文件的任意位置,在文件的任意位置读写数据。如果要随机访问文件内容,RandomAccessFile是很好的选择。
Random,意为随机、任意,RandomAccessFile,即可访问文件的任意位置;RAM(Random Access Memory),即可访问文件/数据任意位置的内存。
继承与实现
RandomAccessFile直接继承自Object类,看上去就不像是我们之前学习的那么多的输入输出流,都继承于抽象基类。但是,RandomAccessFile通过接口的实现,便能够完成对文件的输入与输出:
public class RandomAccessFile implements DataOutput, DataInput, Closeable
- 实现了Closeable的接口,Closeable接口又继承了AutoCloseable接口,能够实现流的自动关闭。
- 实现了DataOutput接口,提供了输出基本数据类型和字符串的方法,如 writeInt,writeDouble,writeChar,writeBoolean,writeUTF。
- 实现了DataInput接口,提供了读取基本数据类型和字符串的方法,同理对应的把write改成read即可。
RandomAccessFile 类的常用操作方法
构造器
RandomAccessFile(File file, String mode)
RandomAccessFile(String name, String mode)
只有这俩构造器,意思是创建一个支持随机访问文件的流,mode是设置访问方式的参数,前者传入File对象,后者传入路径名。
文件指针
//将指针位置设置为pos,即从流开始位置计算的偏移量,以字节为单位
public void seek(long pos)
//获取指针当前位置,以字节为单位
public native long getFilePointer()
//跳过n个字节的便宜量
public int skipBytes(int n)
read方法
write方法
文件操作的四大方法
内存映射文件
RandomAccessFile的绝大多数功能都已经被JDK 1.4的nio的"内存映射文件(memory-mapped files)"给取代了,但不是全部被取代,所以在使用时你需要考虑一下是否该用"内存映射文件"来代替RandomAccessFile了。
java.nio包使得内存映射变得十分简单
1、首先,从文件中获得一个通道(channel)。通道是用于磁盘文件的一种抽象,它使我们可以访问诸如内存映射、文件加锁机制(下文缓冲区数据结构部分将提到)、文件间快速数据传递等操作系统特性。
FileChannel channel = FileChannel.open(path, options);
还能通过在一个打开的 File 对象(RandomAccessFile、FileInputStream 或 FileOutputStream)上调用 getChannel() 方法获取。调用 getChannel() 方法会返回一个连接到相同文件的 FileChannel 对象且该 FileChannel 对象具有与 File 对象相同的访问权限。
2、然后,通过调用FileChannel类的map方法进行内存映射,map方法从这个通道中获得一个MappedByteBuffer对象(ByteBuffer的子类)。
3、一旦有了缓冲区,就可以使用ByteBuffer类和Buffer超类的方法来读写数据