本文部分内容转自:https://blog.csdn.net/nightcurtis/article/details/51384126

1.RandomAccessFile特点

RandomAccessFile是java Io体系中功能最丰富的文件内容访问类。即可以读取文件内容,也可以向文件中写入内容。但是和其他输入/输入流不同的是,程序可以直接跳到文件的任意位置来读写数据。
因为RandomAccessFile可以自由访问文件的任意位置,所以如果我们希望只访问文件的部分内容,那就可以使用RandomAccessFile类。
与OutputStearm,Writer等输出流不同的是,RandomAccessFile类允许自由定位文件记录指针,所以RandomAccessFile可以不从文件开始的地方进行输出,所以RandomAccessFile可以向已存在的文件后追加内容。则应该使用RandomAccessFile。

2.RandomAccessFile的整体介绍

   RandomAccessFile类包含了一个记录指针,用以标识当前读写处的位置,当程序新创建一个RandomAccessFile对象时,该对象的文件记录指针位于文件头(也就是0处),当读/写了n个字节后,文件记录指针将会向后移动n个字节。除此之外,RandomAccessFile可以自由的移动记录指针,即可以向前移动,也可以向后移动。RandomAccessFile包含了以下两个方法来操作文件的记录指针.

  • long getFilePointer(); 返回文件记录指针的当前位置
  • void seek(long pos); 将文件记录指针定位到pos位置

RandomAccessFile即可以读文件,也可以写,所以它即包含了完全类似于InputStream的3个read()方法,其用法和InputStream的3个read()方法完全一样;也包含了完全类似于OutputStream的3个write()方法,其用法和OutputStream的3个Writer()方法完全一样。除此之外,RandomAccessFile还包含了一系类的readXXX()和writeXXX()方法来完成输入和输出。

RandomAccessFile有两个构造器,其实这两个构造器基本相同,只是指定文件的形式不同而已,一个使用String参数来指定文件名,一个使用File参数来指定文件本身。除此之外,创建RandomAccessFile对象还需要指定一个mode参数。该参数指定RandomAccessFile的访问模式,有以下4个值:

  • “r” 以只读方式来打开指定文件夹。如果试图对该RandomAccessFile执行写入方法,都将抛出IOException异常。
  • “rw” 以读,写方式打开指定文件。如果该文件尚不存在,则试图创建该文件。
  • “rws” 以读,写方式打开指定文件。相对于”rw” 模式,还要求对文件内容或元数据的每个更新都同步写入到底层设备。
  • “rwd” 以读,写方式打开指定文件。相对于”rw” 模式,还要求对文件内容每个更新都同步写入到底层设备。

————————————————
版权声明:本文为CSDN博主「Simon_night」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/nightcurtis/article/details/51384126

案例演示

使用RandomAccessFile类将一个大文件分割为几个小文件。

思路解析

import java.io.*;
public class Test03
{
public static void main(String[] args) throws IOException{
//需要分割的文件
//获取文件的大小
//创建分割器 RandomAccessFile
//块长:你需要将文件分为的每个小文件最大为多大
//总块数=文件长度/块长 使用向上取整(Math.ceil())获得总块数
//定义起始分割位置
int beginPos = 0;
//实际每次分割到的大小 的初始值:=块长>文件长度?文件长度:块长。
//循环 计算并操作 每块分配到的数据
for(int i=0;i<总块数;i++){
//计算新的开始位置
if(i==blockAll-1){//最后一块
//将剩余量赋给实际分割大小变量
}else{
//实际分割大小为块长
//文件长度-=块场
}
//操作每块的数据 可以输出到文件、控制台等等
//fileSplit(beginPos,actualSize);//操作:调用分段输出内容方法
}
//关闭流
raf.close();
} /**
*操作每块的方法用例:输出到控制台
*传入起始位置和实际长度
*/ public static void fileSplit(int beginPos,int actualSize) throws IOException
{
RandomAccessFile raf = new RandomAccessFile(new File("Test01.txt"),"r"); //随机读取
raf.seek(beginPos);
//读取
//操作 分段读取
byte[] flush = new byte[1024];//缓冲容器
int len = -1;//接收长度
while((len = raf.read(flush))!=-1){
if(len<actualSize){//如果本次读到的小于需要的
System.out.println(new String(flush,0,len));//本次读到的全都要
actualSize -= len;//需要的部分减少
}else{//如果本次读取的超过需要的,只拿需要的部分
System.out.println(new String(flush,0,actualSize));
break;
}
} //关闭流
raf.close();
}
}

  

完整代码

import java.io.*;
public class Test05
{
public static void main(String[] args) throws IOException{
//文件
File src = new File("test01.txt");
//文件大小
long len = src.length();
//流
RandomAccessFile raf = new RandomAccessFile(src,"r");
//单块长度
int blockSize = 1024;
//需要分成的总块数
int blockAll = (int)Math.ceil(len*1.0/blockSize);
//开始位置变量
int beginPos = 0;
//单词读取的实际长度及初始值
int actualSize = (int)(blockSize>len?len:blockSize);
//控制台输出文件及块信息
System.out.printf("文件大小:%d 分割块数:%d%n",len,blockAll);
//for循环操作每一块
for(int i = 0;i<blockAll;i++){
//计算开始位置
beginPos = i*blockSize;
if(i!=blockAll-1){//如果不是最后一块
actualSize = blockSize;//本次读取长度等于块长
len-=blockSize;//剩余文件长度
}else{//如果是最后一块
actualSize = (int)len;
}
//调用针对每个块的方法
fileSplit(i,beginPos,actualSize);//调用分割文件方法
System.out.println("第"+i+"块,本次读取数据:"+actualSize+" 剩余文件长度:"+len);
}
} //操作方法:将文件分割并生成分割文件
public static void fileSplit(int i,int beginPos,int actualSize) throws IOException{
//文件
File src = new File("test01.txt");
//流
RandomAccessFile raf = new RandomAccessFile(src,"rw");
RandomAccessFile raf2 = new RandomAccessFile(new File("dest/"+i+"copy.txt"),"rw");//分割文件保存位置
String num = String.valueOf(i); byte[] flush = new byte[1024];
int len = -1;
raf.seek(beginPos);
while((len = raf.read(flush))!=-1){
if(actualSize>len){
raf2.write(flush,0,len);
actualSize -= len;
}else{
raf2.write(flush,0,actualSize);
break;
}
}
raf.close();
raf2.close();
}
}

  

18 IO流(十五)——RandomAccessFile随机访问文件及使用它进行大文件切割的方法的更多相关文章

  1. Java基础知识强化之IO流笔记63:随机访问流RandomAccessFile

    1. 随机访问流RandomAccessFile RandomAccessFile类不属于流,是Object类的子类.但它融合了InputStream和OutputStream的功能.支持对随机访问文 ...

  2. [19/04/03-星期三] IO技术_其它流(RandomAccessFile 随机访问流,SequenceInputStream 合并流)

    一.RandomAccessFile 随机访问流 [版本1] /* *RandomAccessFile 所谓随机读取就是 指定位置开始或指定位置结束 的读取写入文件 * 实现文件的拆分与合并 模拟下载 ...

  3. Java I/O(三)各种Reader和Writer读写器、RandomAccessFile随机访问文件、序列化

    2019 01/01 八.Reader和Writer读写器 前面讲的输入输出流的基本单位都是字节,因此可以称为“字节流”,读写器是以字符为基本单位,可以称为“字符流”.它们的使用方法非常相似,因此我考 ...

  4. Java IO(十五)FilterReader 和 FilterWriter、FilterReader 子类 PushBackReader

    Java IO(十五)FilterReader 和 FilterWriter.FilterReader 子类PushBackReader 一.介绍 FilterReader 和 FilterWrite ...

  5. Java IO详解(六)------随机访问文件流

    File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...

  6. Java IO详解(七)------随机访问文件流

    File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...

  7. Java基础IO流(五)RandomAccessFile

    RandomAccessFile java提供的对文件内容的访问,既可以读文件也可以写文件.RandomAccessFile支持随机访问文件,可以访问文件的任意位置 (1)java文件模型:    在 ...

  8. MappedByteBuffer高速缓存文件、RandomAccessFile随机访问

    说到高速缓存存储,处理读写文件,那就不得不说MappedByteBuffer. 看了好多文章以后写一下自己的总结. 在这里先介绍一下相关的类与方法. 先说一下Buffer.ByteBuffer.Map ...

  9. 跟着刚哥梳理java知识点——IO(十五)

    凡是与输入.输出相关的类.接口都定义在java.io包下 java.io.File类 1.File是一个类,可以有构造器创建其对象.此对象对应着一个文件或者一个目录. 2.File中的类,仅涉及到如何 ...

随机推荐

  1. [转]查看 docker 容器使用的资源

    作者:sparkdev 出处:http://www.cnblogs.com/sparkdev/     在容器的使用过程中,如果能及时的掌握容器使用的系统资源,无论对开发还是运维工作都是非常有益的.幸 ...

  2. 通过三层交换机实现不同VLAN间的通信

    主机的IP地址以及子网掩码已列出,下面将讲解如何配置利用三层交换机来实现不同VLAN间的相互通信 SW1的命令: en  //进入特权模式 conf  t   //全局模式 vlan 10    // ...

  3. 利用Python进行数据分析【第二版】【高清中文版英文版源代码】

    如果被河蟹请回复我更新链接   这是我花钱弄的,免费分享给大家.没有密码,直接可以观看!   希望大家不要拿去后再做收费分享   如果好用,请给个赞好嘛~~~   1.中文pdf 链接:https:/ ...

  4. python计算1~2008中0和1的个数

    计算1~2008中所有自然数中1和0的个数总数. 通过自然数的大小划分区间,将自然数每位上的数载入列表,循环计数. list = [] onecount = 0 zerocount = 0 for i ...

  5. 帝国CMS万能标签标题截取后自动加入省略号

    帝国CMS万能标签标题截取后自动加入省略号,没有达到字数的则不加省略号完美解决方案1.打开e/class/connect.php  搜索 if(!empty($subtitle))//截取字符  大约 ...

  6. 刷题记录:[CISCN2019 华北赛区 Day1 Web2]ikun

    目录 刷题记录:[CISCN2019 华北赛区 Day1 Web2]ikun 一.涉及知识点 1.薅羊毛逻辑漏洞 2.jwt-cookies伪造 Python反序列化 二.解题方法 刷题记录:[CIS ...

  7. Lararel安装和虚拟主机配置

    Laravel 对系统有些要求,当然,所有这些要求 Laravel Homestead 虚拟机都能满足,因此强烈推荐你使用 Homestead 作为你的开发环境. 当然,假如你不使用 Homestea ...

  8. 从宿主机直接进入docker容器的网络空间

    Docker dns nameserver 也是进入容器网络空间,监听53端口,但它通过iptable把端口映射到宿主机上,处理DNS请求的进程就在宿主机上. how does Docker Embe ...

  9. 利用C++ STL的vector模拟邻接表的代码

    关于vector的介绍请看 https://www.cnblogs.com/zsq1993/p/5929806.html https://zh.cppreference.com/w/cpp/conta ...

  10. c# 通过json.net中的JsonConverter进行自定义序列化与反序列化

    https://www.cnblogs.com/yijiayi/p/10051284.html 相信大家在工作中会经常遇见对json进行序列化与反序列化吧,但通常的序列化与反序列化中的json结构与c ...