偶遇RandomAccessFile
一、前言
本来在研究NIO,别人举的栗子里面,看到一个RandomAccessFile类,之前没见过,就去看了一下,现将相关内容记录如下
二、正文
RandomAccessFile直接继承自Object,并且实现DataInput和DataOutput接口,它不属于InputStream和OutputStream类系的,并不是针对流的操作,它能在读取文件的时候前后移动,这个是和其他针对流操作的I/O类的本质区别。
基本上,RandomAccessFile的工作方式是,把DataInputStream和DataOutputStream粘起来,再加上它自己的一些方法,比如定位用的getFilePointer( ),在文件里移动用的seek( ),以及判断文件大小的length( )。此外,它的构造函数还要一个表示以只读方式("r"),还是以读写方式("rw")打开文件的参数 (和C的fopen( )一模一样),它不支持只写文件。它支持对文件随机访问的读取和写入,即我们可以在指定的位置从文件读取/写入数据。
平时,我们如果要往一个文件末尾追加一些数据,我们会将文件加载到内存,然后进行操作,但是如果文件本身非常大,比如好几G的量,那么普通的电脑承受不了,我们这时就可以使用RandomAccessFile,它无需将文件内容加载在内存,便可以在文件末尾追加内容。当然,有可能很多人会问,这个RandomAccessFile可以在文件指定位置插入数据吗?答案是:RandomAccessFile只能在指定位置修改数据,并不能插入数据(据我所知貌似没有哪个类支持在某个文件某个位置插入数据吧)。
RandomAccessFile在读取等长数据的情况下也有优势。
下面给出RandomAccessFile相关使用实例,先看下要操作的文件内容:
//实例一,从指定位置读取文件 package com.randomaccessfile.demo;import java.io.RandomAccessFile;/*** * @author cyg* @date 2017-6-3 下午02:33:13* @description 随机读取文件的内容*/ public class Demo1 {public static void main(String[]args) throws Exception{//文件内容:hello world!RandomAccessFile raf = new RandomAccessFile("C:\\Users\\jackalc\\Desktop\\demo.txt", "r");System.out.println("在未指定位置之前,文件指针:"+raf.getFilePointer());raf.seek(6);//指定文件指针位置,从0开始System.out.println("在指定位置之后,文件指针:"+raf.getFilePointer());int readLength = 0;byte [] bytes = new byte[1024];while((readLength=raf.read(bytes))>0){System.out.println(new String(bytes,0,readLength));}} }//输出 在未指定位置之前,文件指针:0 在指定位置之后,文件指针:6 world!
//实例二,文件末尾追加内容 package com.randomaccessfile.demo;import java.io.RandomAccessFile;/*** * @author cyg* @date 2017-6-3 下午02:33:13* @description 文件末尾追加内容*/ public class Demo2 {public static void main(String[]args) throws Exception{//文件内容:hello world!RandomAccessFile raf = new RandomAccessFile("C:\\Users\\jackalc\\Desktop\\demo.txt", "rw");//读写方式打开raf.seek(raf.length());//将文件的指针移动到原先内容最后一个字节的后面raf.write("最末尾追加的内容".getBytes());} }
实例二运行后,文件内容变更为:
//实例三,在文件指定位置修改文件 package com.randomaccessfile.demo;import java.io.RandomAccessFile;/*** * @author cyg* @date 2017-6-3 下午02:33:13* @description 在文件指定位置修改文件*/ public class Demo3 {public static void main(String[]args) throws Exception{//文件内容:hello world!RandomAccessFile raf = new RandomAccessFile("C:\\Users\\jackalc\\Desktop\\demo.txt", "rw");//读写方式打开raf.seek(6);//"6"是“w”所在的位置raf.write("我现在在指定的位置修改内容,我会覆盖从指定位置开始,和我等长的文件内容!".getBytes());} }
实例三运行之后,文件内容变更成这样:
如果想要在文件指定位置插入数据,而不是修改数据,要怎么操作呢?RandomAccessFile并没有提供这个方法,对于这个需求,我们可以将指定位置后面的内容先存储到临时文件里面,然后等内容插入完,我们再将临时文件的内容插入到刚刚插入的内容后面,贴一下别人的代码(原文见“三、连接”处):
//实例四,在文件指定位置插入内容 package com.randomaccessfile.demo;import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.RandomAccessFile;/*** * @author cyg* @date 2017-6-3 下午02:33:13* @description 在文件指定位置插入内容*/ public class Demo4 {public static void main(String[] args) {//文件内容:hello world!String path="C:\\Users\\jackalc\\Desktop\\demo.txt"; insert(path, 6, "这是我需要插入的内容,不覆盖原先的内容"); } /** * 实现向指定位置 * 插入数据 * @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(); } } }
实例四运行完之后,文件内容如下:
三、链接
1、http://blog.csdn.net/czplplp_900725/article/details/37809579
2、http://www.cnblogs.com/skywang12345/p/io_26.html
3、http://baike.baidu.com/link?url=XqFXrey5USYJQ9kJVKufnL18QtobxJ6DRvYVfjUhXINC8Afctou3qKiN12ZPFSPUNLzyqMGa1ttl12zR7ZG-DA_hv7m3_MLmnSWNdYT6-re
四、联系本人
为方便没有博客园账号的读者交流,特意建立一个企鹅群(纯公益,非利益相关),读者如果有对博文不明之处,欢迎加群交流:261746360,小杜比亚-博客园
转载于:https://www.cnblogs.com/xdouby/p/6937434.html
偶遇RandomAccessFile相关推荐
- Java RandomAccessFile的使用
Java的RandomAccessFile提供对文件的读写功能,与普通的输入输出流不一样的是RamdomAccessFile可以任意的访问文件的任何地方.这就是"Random"的意 ...
- Java断点续传(基于socket与RandomAccessFile的实现)
这是一个简单的C/S架构,基本实现思路是将服务器注册至某个空闲端口用来监视并处理每个客户端的传输请求. 客户端先获得用户给予的需传输文件与目标路径,之后根据该文件实例化RandomAccessFile ...
- Java IO 4 : RandomAccessFile
RandomAccessFile: 认识:java输入/输出流体系中功能最丰富的文件内容访问类 既可以读取文件内容,也可以向文件传输数据,并且支持"随机访问"的方式,程序可以跳转到 ...
- JAVA IO - RandomAccessFile Seek学习
2019独角兽企业重金招聘Python工程师标准>>> JAVA IO - RandomAccessFile Seek学习 import java.io.RandomAccessFi ...
- randomAccessFile
随机访问文件类 2008-05-21 随机访问类(RandomAccessFile) - [] 输入流FileInputStream和输出流 FileOutputStream,实现的是对磁盘文件的顺序 ...
- 随机访问类(RandomAccessFile)
随机访问类(RandomAccessFile) 随机访问类(RandomAccessFile) - [] 输入流FileInputStream和输出流 FileOutputStream,实现的是对磁盘 ...
- [二十五]JavaIO之RandomAccessFile
功能简介 我们之前一直说流顺序的,不能随机访问,的确之前说的IO体系的确如此 但是 RandomAccessFile自成一派 此类的实例支持对随机访问文件的读取和写入 我们之前介绍过DataOutpu ...
- RandomAccessFile学习笔记
简介 RandomAccessFile是一个神奇的存在,既可以从文件中读,又可以向文件输出数据.另外还支持"随机访问",可以直接跳转到文件的任意位置来读写数据. RandomAcc ...
- JAVA SE学习day_04:RandomAccessFile
RandomAccessFile 1. java.io.RandomAccessFile java.io.RandomAccessFile是用来读写文件的API,其基于指针可以对文件任意位置进行读写操 ...
- [Rainy开发笔记]使用RandomAccessFile实现的Tail
为什么80%的码农都做不了架构师?>>> 怎么实现一个tail,一开始的想法是在本地或者内存记录下当前读取到的文件的位置,然后每隔一定时间检测下看看是否有更新,想好了之后就准备 ...
最新文章
- [每日短篇] 1D - 消除 if 的一种方法
- qt5.5.1配置winpcap4.1.2
- Spring Boot由jar包转成war包
- SpringMVC的简单知识
- Javascript-Switch
- linux 下 c++ 实现 netstat_Linux下基于签名技术的软件保护之实现流程
- php实现ssh客户端,php无阻塞SSH客户端实例
- 问题-提示“请确定磁盘未满或未被写保护而且文件未被使用”
- 中国兽医显微镜市场趋势报告、技术动态创新及市场预测
- Egyptian Collegiate Programming Contest (ECPC 2015) C题 Connecting Graph
- Teamtalk线程池
- wegame显示密保服务器,wegame英雄联盟怎么选定大区
- 浪潮存储通过ISCSI映射至Linux服务器、多路径配置方法
- 计算机技术与软件专业技术资格考试(初级程序员)(一)
- 如何使用星际文件传输网络(IPFS)搭建区块链服务(一)
- Qt开源作品35-秘钥生成器
- Java实现QQ邮件发送
- 关于opencv读取图片,无法正常显示
- 量子计算机可以发明时光机,俄科学家发明全球第一台时光机,可让微小粒子向过去移动1秒钟...
- 分享七天写好SCI初稿:
热门文章
- 针式打印机打印显示传真服务器,针式打印机怎么设置【图文详解】
- 无线通信蜂窝网络 的 覆盖范围
- Safari浏览器中工具栏的高度问题
- 2020寒假【gmoj2008】【Oliver的成绩】【高精度】
- 【BFS】Oliver的救援
- 毁掉一个年轻最好的办法,就是向他鼓吹财务自由
- 游戏的现实规则和非现实规则
- python股票量化投资刑不行_【邢不行|量化小讲堂系列10-Python量化入门】量化投资中如何处理复权、除权问题...
- DeleteRow()
- 李宏毅作业十 Generative Adversarial Network生成对抗网络(代码)