Java-RandomAccessFile-实现文件随机读写

RandomAccessFile类 NULL 博文链接:https://chaoyi.iteye.com/blog/2083498 立即下载

现有如下的一个需求,向已存在1G数据的txt文本里末尾追加一行文字,内容如下“Lucene是一款非常优秀的全文检索库”。可能大多数朋友会觉得这个需求很easy,说实话,确实easy,然后XXX君开始实现了,直接使用Java中的流读取了txt文本里原来所有的数据转成字符串后,然后拼接了“Lucene是一款非常优秀的全文检索库”,又写回文本里了,至此,大功告成。后来需求改了,向5G数据的txt文本里追加了,结果XXX君傻了,他内存只有4G,如果强制读取所有的数据并追加,会报内存溢出的异常。

其实上面的需求很简单,如果我们使用JAVA IO体系中的RandomAccessFile类来完成的话,可以实现零内存追加。其实这就是支持任意位置读写类的强大之处。



在这之前,还是先啰嗦的介绍下RandomAccessFile这个类,RandomAccessFile是Java中输入,输出流体系中功能最丰富的文件内容访问类,它提供很多方法来操作文件,包括读写支持,与普通的IO流相比,它最大的特别之处就是支持任意访问的方式,程序可以直接跳到任意地方来读写数据。

如果我们只希望访问文件的部分内容,而不是把文件从头读到尾,使用RandomAccessFile将会带来更简洁的代码以及更好的性能。

下面来看下RandomAccessFile类中比较重要的2个方法,其他的和普通IO类似,在这里,就不详细说明了。

方法名作用
getFilePointer()返回文件记录指针的当前位置
seek(long pos)将文件记录指针定位到pos的位置

下面散仙给出示例,分析下怎么使用RandomAccessFile
首先,我们先看下要操作的文本文件的内容截图。

功能one,读取任意位置的数据,代码如下

/** 
     * 读的方法 
     * @param path 文件路径 
     * @param pointe 指针位置 
     * **/  
    public static void randomRed(String path,int pointe){  
        try{  
            //RandomAccessFile raf=new RandomAccessFile(new File("D:\\3\\test.txt"), "r");  
            /** 
             * model各个参数详解 
             * r 代表以只读方式打开指定文件 
             * rw 以读写方式打开指定文件 
             * rws 读写方式打开,并对内容或元数据都同步写入底层存储设备 
             * rwd 读写方式打开,对文件内容的更新同步更新至底层存储设备 
             *  
             * **/  
            RandomAccessFile raf=new RandomAccessFile(path, "r");  
            //获取RandomAccessFile对象文件指针的位置,初始位置是0  
            System.out.println("RandomAccessFile文件指针的初始位置:"+raf.getFilePointer());  
            raf.seek(pointe);//移动文件指针位置  
            byte[]  buff=new byte[1024];  
            //用于保存实际读取的字节数  
            int hasRead=0;  
            //循环读取  
            while((hasRead=raf.read(buff))>0){  
                //打印读取的内容,并将字节转为字符串输入  
                System.out.println(new String(buff,0,hasRead));  
                  
            }  
              
              
              
        }catch(Exception e){  
            e.printStackTrace();  
        }  
          
          
          
    }  

测试代码

public static void main(String[] args) {  
    String path="D:\\3\\test.txt";         
     int seekPointer=20;  
     randomRed(path,seekPointer);//读取的方法   
    //randomWrite(path);//追加写的方法  
    //insert(path, 33, "\nlucene是一个优秀的全文检索库");  
} 

运行效果:

RandomAccessFile文件指针的初始位置:0  
is a teacher  
hadoop is perfect  

功能two,追加数据,代码如下

/** 
 * 追加方式 
 * 写的方法 
 * @param path 文件路径 
 * ***/  
public static void randomWrite(String path){  
    try{  
        /**以读写的方式建立一个RandomAccessFile对象**/  
        RandomAccessFile raf=new RandomAccessFile(path, "rw");  
          
        //将记录指针移动到文件最后  
        raf.seek(raf.length());  
        raf.write("我是追加的 \r\n".getBytes());  
          
    }catch(Exception e){  
        e.printStackTrace();  
    }  
      
}  

测试代码

public static void main(String[] args) {  
    String path="D:\\3\\test.txt";         
     //int seekPointer=20;  
    // randomRed(path,seekPointer);//读取的方法   
     randomWrite(path);//追加写的方法  
    //insert(path, 33, "\nlucene是一个优秀的全文检索库");  
}  

运行效果:


功能three,任意位置插入数据,代码如下

/** 
     * 实现向指定位置 
     * 插入数据 
     * @param fileName 文件名 
     * @param points 指针位置 
     * @param insertContent 插入内容 
     * **/  
    public static void insert(String fileName,long points,String insertContent){  
        try{  
        File tmp=File.createTempFile("tmp", null);  
        tmp.deleteOnExit();//在JVM退出时删除  
          
        RandomAccessFile raf=new RandomAccessFile(fileName, "rw");  
        //创建一个临时文件夹来保存插入点后的数据  
        FileOutputStream tmpOut=new FileOutputStream(tmp);  
        FileInputStream tmpIn=new FileInputStream(tmp);  
        raf.seek(points);  
        /**将插入点后的内容读入临时文件夹**/  
          
        byte [] buff=new byte[1024];  
        //用于保存临时读取的字节数  
        int hasRead=0;  
        //循环读取插入点后的内容  
        while((hasRead=raf.read(buff))>0){  
            // 将读取的数据写入临时文件中  
            tmpOut.write(buff, 0, hasRead);  
        }  
          
        //插入需要指定添加的数据  
        raf.seek(points);//返回原来的插入处  
        //追加需要追加的内容  
        raf.write(insertContent.getBytes());  
        //最后追加临时文件中的内容  
        while((hasRead=tmpIn.read(buff))>0){  
            raf.write(buff,0,hasRead);  
        }  
        }catch(Exception e){  
            e.printStackTrace();  
        }  
    }  

测试代码

public static void main(String[] args) {  
        String path="D:\\3\\test.txt";         
         //int seekPointer=20;  
        // randomRed(path,seekPointer);//读取的方法   
        // randomWrite(path);//追加写的方法  
         insert(path, 33, "\nlucene是一个优秀的全文检索库");  
    }  

运行效果:



至此,RandomAccessFile类的几个功能,散仙在代码中已给出实现了,现在回到本文开始前的提的那个需求,用RandomAccessFile类就可以轻而易举的完成了,另外需要注意的是,向指定位置插入数据,是散仙自己改造的功能,RandomAccessFile并不直接支持,需要新建一个缓冲区临时空间,存数据,然后在写,因为一旦数据量上了级别,在任意位置插入数据,是很耗内存的,这个也就是为什么hadoop的HDFS文件系统,只支持append的方式,而没有提供修改的操作。


另外我们可以用RandomAccessFile这个类,来实现一个多线程断点下载的功能,用过下载工具的朋友们都知道,下载前都会建立两个临时文件,一个是与被下载文件大小相同的空文件,另一个是记录文件指针的位置文件,每次暂停的时候,都会保存上一次的指针,然后断点下载的时候,会继续从上一次的地方下载,从而实现断点下载或上传的功能,有兴趣的朋友们可以自己实现下。

基于多时间尺度的电动汽车光伏充电站联合分层优化调度(Matlab代码实现) 该研究提出了一种电动汽车光伏充电站的分层优化调度方法,采用日前-日内两阶段协同优化框架。日前阶段通过混合整数规划对多充电站进行全局优化,以平抑电网波动和降低购电成本为目标;日内阶段基于实时数据,采用NSGA-II等算法动态分配充电功率。该方法实现了光伏高效消纳、成本节约和电网负荷平衡的有效统一。 阅读详情

相关推荐

Java IO体系之强大的RandomAccessFile

现有如下的一个需求,向已存在1G数据的txt文本里末尾追加一行文字,内容如下“Lucene是一款非常优秀的全文检索库”。可能大多数朋友会觉得这个需求很easy,说实话,确实easy,然后XXX君开始实现了,直接使用Java中的流读取了txt文本里原来所有的数据转成字符串后,然后拼接了“Lucene是一款非常优秀的全文检索库”,又写回文本里了,至此,大功告成。后来需求改了,向5G数据的txt文本里追

gdp5211314的专栏 1070

用KalmanNet搞定非线性状态估计:当卡尔曼滤波遇上神经网络

本文深入探讨了KalmanNet如何将神经网络与卡尔曼滤波结合,以解决非线性状态估计中的模型失配和噪声不确定性问题。通过保留经典滤波框架并用RNN学习卡尔曼增益,该方法在无人机导航、机器人定位等场景中实现了模型驱动与数据驱动的优势互补,提升了估计的鲁棒性和灵活性。

mango的博客 310

Java SE(十六):File、RandomAccessFile

包括File类简介、查看文件或目录、新建文件或目录、删除文件或目录、查看目录内容、FileFilter接口、顺序读写方法、基于缓存的写方法、基于缓存的读方法、随机读写方法。

qq_45138120的博客 1479

基于QT的华为网络摄像头二次开发

第一次使用华为的网络摄像头并进行二次开发,网上关于QT对华为网络摄像头的二次开发的文章很少,基于项目的需求做了一些工作,特此记录。 目标: 1、实时预览 2、手动控制录制视频 3、监听告警型号 4、实时获取元数据中的划定区域内的人数 摄像头型号如下: 准备工作: 在购买摄像头后,应当在官网下载对应的开发资料,如果需要权限,则联系华为的技术支持人员。下载资料如下: SDC Development Kit Demo 8.0.T9 SDK DEMO下载地址:https://bbs.hua

xumingyifrend的博客 3169

【unity实战】Unity游戏开发:如何用ScriptableObject与序列化多态实现可复用的模块化效果系统?

本文介绍了两种实现卡牌游戏效果系统的模块化设计方案。方案一使用ScriptableObject创建独立的效果资产,通过组合实现不同效果,优点是数据可复用、可视化编辑,缺点是同类不同参数效果需创建大量SO文件。方案二利用SerializeReference特性直接嵌套效果实例,避免SO文件过多,但需要插件支持编辑器多态显示。两种方案都将效果与卡牌解耦,提高了代码复用性和扩展性,解决了硬编码带来的重复、维护困难和扩展不便等问题。开发者可根据项目需求选择合适方案,或结合两者优势构建更灵活的系统。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 436

RandomAccessFile随机读写文件操作类讲解

http://blog.youkuaiyun.com/u013087513/article/details/51911577

Snow_Ice_Yang的博客 1431

人形机器人电路板和算法分析

人形机器人电路板与算法深度剖析 电路板领域:人形机器人电子系统分为计算、驱动、感知、能源、通信五大模块。主控板采用高性能SoM(如NVIDIA Jetson AGX Orin),需满足严格电源完整性(PDN)与信号完整性(SI)要求;关节驱动板集成MCU、GaN/SiC功率器件及高精度编码器接口,采用刚柔结合PCB以适应狭小空间。挑战包括热-振可靠性(85°C/10G振动)、高密度互连(3mil线宽)及EMC兼容性。 算法领域:运动控制依赖MPC(模型预测控制)与强化学习(RL),实现实时动态平衡;感知算法

几十年资深高级架构师,技术专家的技术笔记。专注C、Java、Python、微服务、云原生、AI工程化及高并发系统分布式架构实战,分享源码剖析、性能调优与架构治理经验。 306

RandomAccessFile类实现随机读写文件

java.io.RandomAccessFile类能够实现对文件内的随机位置进行读写操作。通过下面的一个实例来进行了解。 实例: public class RandomAccessFileDemo03 { public static void main(String[] args) throws IOException{ File f1=new File("e:"+File.separ

Dream It Possible 2747

读懂 SAP S/4HANA 里的 SAP Fiori 架构:前端服务器、搜索链路、传统应用接入与内容组织全景解析

摘要:SAP Fiori架构并非简单的系统连接图,而是明确区分界面层与业务数据层的三层分工体系:用户交互层(浏览器与Fiori launchpad)、前端技术层(SAPUI5运行环境)和业务数据层(SAP S/4HANA后端)。这种分离实现了生命周期解耦,前端专注于统一体验治理,后端处理核心业务逻辑。值得注意的是,SAP Fiori front-end server本质仍是ABAP系统,负责UI技术组件运行。虽然SAP S/4HANA推荐嵌入式部署,但独立部署在多系统场景中仍有价值。典型Fiori应用通过O

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 179

复旦微实现串口在线升级BOOT.BIN

将该 demo 生成的 app(升级用)和 fsbl、最简化 bit 文件(可选)打包成 BOOT.BIN,作为 golden image 烧写在 qspi flash 偏移 0 地址开始的位置,其中最简化 bit 文件为在线升级功能提供必要的物理通道(如果不需要,可以不打包该文件),golden image 一旦发布基本不需要进行升级,由该 golden image 负责和上位机进行通信交互,完成业务 app、业务 bit 文件、uboot 以及操作系统 image 等文件在线升级,在qspi flash

wangjie36的博客 3174

RandomAccessFile随机读写文件

RandomAccessFile(随机读写文件)1、直接继承Object.主要功能是完成随机读写功能,可以读取指定位置的内容。2、构造方法:只能操作文件public RandomAccessFile(File file,String mode) 创建一个随机访问文件流读,随意写来,由 File参数指定的文件。public RandomAccessFile(String name,String mo...

Jones0524的博客 469

2023年12月青少年C/C++软件编程(三级)等级考试试卷及答案解析

有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。第一行一个数字n,n不超过100,表示有n*n的宿舍房间。接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。输出为一行,表达式的值。任给两个正整数N、M,求一个最小的正整数a,使得a和(M-a)都是N的因子。

长春高老师编程 1511

Java 实现文件随机读写-RandomAccessFile

使用JAVA IO体系中的RandomAccessFile类来完成的话,可以实现零内存追加。其实这就是支持任意位置读写类的强大之处。 在这之前,还是先啰嗦的介绍下RandomAccessFile这个类,RandomAccessFile是Java中输入,输出流体系中功能最丰富的文件内容访问类,它提供很多方法来操作文件,包括读写支持,与普通的IO流相比,它最大的特别之处就是支持任意访问的方式,程序可以...

qq1010234991的博客 494

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

JAVA随机读写功能实现类_Java 实现文件随机读写-RandomAccessFile

RandomAccessFile是Java中输入,输出流体系中功能最丰富的文件内容访问类,它提供很多方法来操作文件,包括读写支持,与普通的IO流相比,它最大的特别之处就是支持任意访问的方式,程序可以直接跳到任意地方来读写数据。如果我们只希望访问文件的部分内容,而不是把文件从头读到尾,使用RandomAccessFile将会带来更简洁的代码以及更好的性能。下面来看下RandomAccessFile类...

weixin_35794280的博客 267

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

java 随机文件_Java 实现文件随机读写-RandomAccessFile

现有如下的一个需求,向已存在1G数据的txt文本里末尾追加一行文字,内容如下“Lucene是一款非常优秀的全文检索库”。可能大多数朋友会觉得这个需求很easy,说实话,确实easy,然后XXX君开始实现了,直接使用Java中的流读取了txt文本里原来所有的数据转成字符串后,然后拼接了“Lucene是一款非常优秀的全文检索库”,又写回文本里了,至此,大功告成。后来需求改了,向5G数据的txt文本里追...

weixin_39625258的博客 346

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

java 文件随机读取_Java 实现文件随机读写-RandomAccessFile

现有如下的一个需求,向已存在1G数据的txt文本里末尾追加一行文字,内容如下“Lucene是一款非常优秀的全文检索库”。可能大多数朋友会觉得这个需求很easy,说实话,确实easy,然后XXX君开始实现了,直接使用Java中的流读取了txt文本里原来所有的数据转成字符串后,然后拼接了“Lucene是一款非常优秀的全文检索库”,又写回文本里了,至此,大功告成。后来需求改了,向5G数据的txt文本里追...

weixin_39958025的博客 502

Java学习笔记---实现文件随机读写-RandomAccessFile

转载博客地址: http://www.cnblogs.com/zuochengsi-9/p/6485737.html 写的例子都能看懂,很好 下面是正文 Java 实现文件随机读写-RandomAccessFile 现有如下的一个需求,向已存在1G数据的txt文本里末尾追加一行文字,内容如下“Lucene是一款非常优秀的全文检索库”。可能大多数朋友会觉得这个需求

紫色飞鱼儿的博客 776

Java 实现文件随机读写-RandomAccessFile避免内存溢出

https://www.cnblogs.com/zuochengsi-9/p/6485737.html

sinat_41359797的博客 1446

Java的文件读写操作

file(内存)----输入流---->【程序】----输出流---->file(内存) 当我们读写文本文件的时候,采用Reader是非常方便的,比如FileReader,InputStreamReader和BufferedReader。其中最重要的类是InputStreamReader, 它是字节转换为字符的桥梁。你可以在构造器重指定编码的方式,如果不指定的话将采用底层操作系统的默认编

jiangxinyu的专栏 30万+

Java IO操作——简单了解RandomAccessFile随机读写文件操作类的使用

学习目标

3万+

Java-Io-RandomAccessFile(任意位置读写数据)

介绍 RandomAccessFile是java语言中最丰富的文件访问类。RandomAccessFile类支持随机访问方式,可以跳转到文件的任意位置读写数据,这个类在文件随机读取时有很大的优势,可利用多线程完成对一个大文件的读写,利用seek对文件进行切分,从大文件的不同位置开线程进行读写。 构造,模式,方法 RandomAccessFile他的构造函数只有两种,所以仅限于操作文件,不能访问其他io设备,比如网络,内存映像等。 而底层是使用c/c++进行操作的,所以无法进行自定义操作 如果Random

weixin_45203607的博客 3248

RandomAccessFile 随机读写类,文件加密;文件拷贝;文件流读写拷贝

回顾: Collection ArrayList Map HashMap Properties LinkedList - 链表,灵活性 Collections - 工具类 sort java.io File -> 内存对象,表示文件/目录,和本地有没有这个文件/目录没关系 listFiles() listFiles(FileFilter-accept) getName() .... isF...

szl7369的博客 490
上一篇: MySQL执行计划解析
下一篇: windows python3.7 和 Scrapy环境 搭建
木木那年
博客等级 码龄12年 37粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值