对RandomAccessFile的理解

本文介绍 Java 中 RandomAccessFile 类的基本用法,包括文件的读写操作、文件指针的移动技巧等,并通过示例代码展示如何实现文件的追加写入及跳过指定字节数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们先来看看文档:
RandomAccessFile此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。
那么通过对上面的理解,我们大致能够猜出这个类是对文件进行操作,同事,同事具有对对文件的随机访问能力,同时我们发现,这个类对文件操作是使用了文件指针的方式进行访问的。在读取数据时,我们通过文件指针的前移来读取,在进行写的时候,文件总文件指针开始写入。可能还是比较抽象,现在我们来测试一下
首先我们点击工程–>新建文件夹—>新建文件new.txt–>输入部分东西做测试
这里写图片描述

接着我们看demo

package com.fangzhiyue.demo;

import java.awt.Window.Type;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;

public class Demo {

      String data=",手里拿着小皮鞭,抽他的pp";
    RandomAccessFile randomAccessFile;
    File file;
     ByteArrayInputStream byteArrayInputStream;
    public static void main(String[] args) {
    new Demo();
    }

    public Demo() {
        file=new File("world//new.txt");
           long length=file.length();
        byteArrayInputStream=new ByteArrayInputStream(data.getBytes());
    try {
        randomAccessFile=new RandomAccessFile(file, "rw");
        randomAccessFile.seek(length);
        //将文件指针移动到文件尾
        byte[] b=new byte[1024];
        int len;
       while(((len=byteArrayInputStream.read(b)))!=-1){
           randomAccessFile.write(b);
       }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }
}

然后我们看下结果
这里写图片描述

结果果然如此,继续探讨,查找文档,我发现了这个
这里写图片描述
还记得在刚学java的时候,就看到了这个api,不过部分的io流并不支持skip();,mark();,reset();方法,玩了,程序写多了,直接加号了,我们玩玩这个方法。我们将new.txt文件修改减少一部分
这里写图片描述
在java中中文占两个字节,用char类型表示,因为是Unicode编码,
ps: utf-8 的汉字占3个字节 gbk 是两个
我们修改demo如下

package com.fangzhiyue.demo;

import java.awt.Window.Type;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;

public class Demo {

      String data=",手里拿着小皮鞭,抽他的pp";
    RandomAccessFile randomAccessFile;
    File file;
     ByteArrayInputStream byteArrayInputStream;
    public static void main(String[] args) {
    new Demo();
    }

    public Demo() {
        file=new File("world//new.txt");
           long length=file.length();
        byteArrayInputStream=new ByteArrayInputStream(data.getBytes());
    try {
        randomAccessFile=new RandomAccessFile(file, "rw");
        //randomAccessFile.seek(length);
        byte[] b=new byte[1024];
        int len;
        randomAccessFile.skipBytes(14);
       while(((len=byteArrayInputStream.read(b)))!=-1){
           randomAccessFile.write(b,0,len);
       }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }
}

我们仅仅修改了两行代码,注释了seek()方法,运用skipBytes(14)跳过了14个字节,程序运行如下
这里写图片描述

可以,也是实现了,那么我们会好奇,这个东西有什么用呢?大家想想我们在什么时候用的到?。。。。。
就不卖关子了,我们在下载的时候就能用得到,当我们在下载lol或者cf啊什么的时候,tmd突然断网了,你内心是崩溃的,如果没有这种缓存技术,那么恐怕你每次下载东西下一半断网,就得从新下载,想想你们99%的lol就心寒,毕竟等了那么长时间,具体怎么实现,见下回分解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值