RandomAccessFile实现文件分割、合并

简介: RandomAccessFile实现文件分割、合并

RandomAccessFile可使用的操作模式:

“rwd”模式可用于减少执行的“I/O”操作数量。使用“rwd”仅要求更新要写入存储的文件的内容;使用“rws”要求更新要写入的文件内容与元数据


1.文件分割

/*
* @param fileName:源文件;
* @param filterFolder:分割后文件所在的目录;
* @param size:分割文件大小,以KB为单位;
*/
public void cut(String fileName,String filterFolder,int size) throw Exception{
    size = size*1024;
    int maxx = 0;
    //如果输出目录不存在则创建
    File outFolder = new File(fileterFolder);
    if(!outFolder.exists()){
        outFolder.mkdirs();
    }
    File inFile = new File(fileName);
    int fileLength = (int) inFile.length();//取得文件大小
    int value;//取得文件要分割的个数
    RandomAccessFile inRAF = new RandomAccessFile(inFile,"r");//打开要被分割的文件
    value = fileLength/size;
    int i = 0;
    int j = 0;
    for(;j<value;j++){
        File outFile = new File(filterFolder+File.separator+inFile.getName()+j+"tmp");
        RamdomAccessFile outRAF = new RandomAccessFile(outFile,"rw");
        maxx +=size;
        for(;i<maxx;i++){
            outRAF.write(inRAF.read());
        }
        outRAF.close();
    }
    /*将最后不足 size 的字节内容输出*/
    File outFile = new File(filterFolder+File.separator+inFile.getName()+j+"tmp");
    RamdomAccessFile outRAF = new RandomAccessFile(outFile,"rw");
    for(;i<fileLength;i++){
        outRAF.write(inRAF.read());
    }
    outRAF.close();
    inRAF.close();
}


2.文件合并

/*
* @param fileName:合并之后的文件;
* @param filterFolder:分割文件所在的目录;
* @param filterName:分割后的文件后缀
*/
public void unite(String fileName,String filterFolder,final String filterName) throws Exception{
    File[] tt;
    File inFile = new File(filterFolder);//在当前目录下的文件
    File outFile = new File(fileName);//取得输出名
    RandomAccessFile outRAF = new RandomAccessFile(outFile,"rw");
    /*
        FilenameFilter:文件名过滤器;
        boolean accept(File dir,String name);   
        //dir表示文件的当前目录,name表示文件名;
        //FilenameFilter用来把符合要求的文件或目录返回;
    */
    tt = inFile.listFiles(new FilenameFilter(){
        public boolean accept(File dir,String name){
            String rr = new File(name).toString();
            return rr.endsWith(filterName);
            //filterName 为final ,故方法内部的匿名类可以取得
        }
    });
    //打印取得的文件名
    for(int i = 0 ;i<tt.length;i++){
            System.out.println(tt[i]);
    }
    //打开所有的文件再写入一个文件里
    for(int i = 0;i<tt.length,i++){
        RandomAccessFile inRAF = new RandomAccessFile(tt[i],"r");
        int e;
        while((e=inRAF.read()! = -1)){
            outRAF.write(e);
        }
    }
    outRAF.close();
}


目录
相关文章
|
存储 安全 API
什么是API Token?
API令牌是一种用于访问和验证API(应用程序编程接口)的安全凭证。它是一个字符串,用于识别和授权应用程序或用户访问特定的API服务或资源。==API令牌可以是访问令牌(Access Token)或密钥(API Key)==。
3526 0
|
SQL 存储 JSON
MySQL执行请求报错 Error: Row size too large (>8126)
最近遇到一个业务问题,在执行一个大的业务查询时会抛出异常报错,所以今天就总结一下 Row size too large (>8126) 报错的相关问题。
|
canal 消息中间件 关系型数据库
详解 canal 同步 MySQL 增量数据到 ES
canal 是阿里知名的开源项目,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。 这篇文章,我们手把手向同学们展示**使用 canal 将 MySQL 增量数据同步到 ES**
详解 canal 同步 MySQL 增量数据到 ES
|
7月前
|
存储 人工智能 自然语言处理
深度解析智能体工作流(Agentic Workflows):核心概念、模式与应用
本文系统解析智能体工作流(Agentic Workflow),结合AI智能体的推理、工具与记忆能力,实现复杂任务的动态执行。内容涵盖核心概念、关键模式及实际应用,帮助读者全面理解其价值与挑战。
6552 1
|
自然语言处理 JavaScript Java
Spring 实现 3 种异步流式接口,干掉接口超时烦恼
本文介绍了处理耗时接口的几种异步流式技术,包括 `ResponseBodyEmitter`、`SseEmitter` 和 `StreamingResponseBody`。这些工具可在执行耗时操作时不断向客户端响应处理结果,提升用户体验和系统性能。`ResponseBodyEmitter` 适用于动态生成内容场景,如文件上传进度;`SseEmitter` 用于实时消息推送,如状态更新;`StreamingResponseBody` 则适合大数据量传输,避免内存溢出。文中提供了具体示例和 GitHub 地址,帮助读者更好地理解和应用这些技术。
2725 122
|
消息中间件 canal Java
如何保证Canal+MQ同步消息的顺序性?
如何保证Canal+MQ同步消息的顺序性?
|
Linux Shell
linux 查看某个文件夹属于哪个盘
在 Linux 系统中,要查看某个文件夹属于哪个磁盘分区,你可以使用多种方法。以下是几种常见的方法: 方法一:使用 df 命令 df 命令用于显示文件系统的磁盘空间使用情况。 打开终端。 使用以下命令查看文件夹所属的磁盘分区: bash df -h /path/to/your/folder 其中 /path/to/your/folder 是你要查询的文件夹路径。 示例: bash df -h /home/user/Documents 输出将类似于: Filesystem Size Used Avail Use% Mounted on /dev/sda1
2772 1
|
存储 Java 测试技术
一文彻底搞懂阿里开源TransmittableThreadLocal的原理和使用
【10月更文挑战第2天】在Java多线程编程中,线程本地变量(ThreadLocal)是一个非常有用的工具,它能够在每个线程中保存一个独立的变量副本,从而避免多线程环境下的数据竞争问题。然而,在使用线程池等高级多线程技术时,ThreadLocal却面临着一些挑战。为了解决这个问题,阿里巴巴开源了TransmittableThreadLocal(TTL),它扩展了ThreadLocal的功能,使其能够在复杂的多线程环境中正确传递值。本文将深入探讨TTL的原理和使用,帮助读者彻底理解这一技术干货。
2712 0
|
存储 前端开发 Java
MultipartFile实现文件上传和下载(Springboot)
MultipartFile实现文件上传和下载(Springboot)
1340 0