导读
写文件基本是单线程顺序写的,用 FileOutputStream 就可以了。但是读文件一般不是顺序读的,为了实现想读哪里读哪里的功能,通常需要 RandomAccessFile。
在我们读文件之前,首先要知道数据起始位置(offset)和长度(length),这样才能使用 RandomAccessFile 的 seek方法移动到数据起始位置,然后将数据读出来。
基本过程就是这样的,很简单:
try (RandomAccessFile raf = new RandomAccessFile(file, "r")) {
// 数据长度为 10 字节
int length = 10;
// 数据起始位置为 offset=5
int offset = 5;
// 开辟长度为 length 数组
byte[] result = new byte[length];
// 将 RAF 移动到数据起始位置,准备读 length 个字节
raf.seek(offset);
// 读 length 个字节
int count = raf.read(result);
System.out.println("读了 " + count + " 个字节");
// 再读一次
count = raf.read(result);
System.out.println("读了 " + count + " 个字节");
} catch (Exception e) {
e.printStackTrace();
}
上面这段代码看起来挺完整的,但是,缺少了一个重要环节,验证。当你交给一个人做一件事之后,要验证他是否完成,以及完成的怎么样。这里也一样。
RandomAccessFile 的 read(byte b[]) 方法的定义是这样的(去掉了不重要的doc):读取 b.length 个字节,放到 b 中,并返回一共读取了多少个字节;当到达文件末尾,没有数据可读时,返回 -1。
/**
* Reads up to {@code b.length} bytes of