Java字节分割文件流

使用 Java 通过字节分割大文件并将其以文件流的方式读写的示例代码。这个代码展示了如何将一个大文件分割成多个小文件,并以字节流的方式操作文件。

完整代码示例

javascript 复制代码
import java.io.*;

public class FileSplitter {

    public static void main(String[] args) {
        // 原始文件路径
        String sourceFilePath = "largefile.dat";
        // 目标分割文件存放路径
        String targetDirectory = "splitted_files/";
        // 分割文件大小 (单位:字节)
        int splitSize = 1024 * 1024; // 1MB

        try {
            splitFile(sourceFilePath, targetDirectory, splitSize);
            System.out.println("文件分割完成!");
        } catch (IOException e) {
            System.err.println("文件分割失败: " + e.getMessage());
        }
    }

    /**
     * 将大文件按指定大小分割成多个小文件
     * 
     * @param sourceFilePath 原始文件路径
     * @param targetDirectory 分割文件的存放目录
     * @param splitSize 每个分割文件的大小(字节)
     * @throws IOException 文件操作异常
     */
    public static void splitFile(String sourceFilePath, String targetDirectory, int splitSize) throws IOException {
        File sourceFile = new File(sourceFilePath);
        File targetDir = new File(targetDirectory);

        // 如果目标目录不存在,创建目录
        if (!targetDir.exists()) {
            targetDir.mkdirs();
        }

        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourceFile))) {
            byte[] buffer = new byte[splitSize];
            int bytesRead;
            int partNumber = 1;

            // 按分割大小读取文件并保存为多个小文件
            while ((bytesRead = bis.read(buffer)) > 0) {
                File partFile = new File(targetDirectory + sourceFile.getName() + ".part" + partNumber);
                try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(partFile))) {
                    bos.write(buffer, 0, bytesRead);
                }
                System.out.println("生成分割文件:" + partFile.getName());
                partNumber++;
            }
        }
    }
}

功能描述

输入参数:

原始文件路径(sourceFilePath):需要被分割的大文件的路径。

目标目录路径(targetDirectory):存放分割后的小文件的路径。

分割大小(splitSize):每个小文件的大小(以字节为单位)。

流程:

使用 BufferedInputStream 读取源文件。

按指定大小(splitSize)将文件读取为字节块。

每读取一个字节块,就创建一个新文件(分割文件),并用 BufferedOutputStream 写入。

循环此过程,直到原始文件读取完毕。

输出:

分割后的文件存储在指定的目录下,文件名格式为:原始文件名.part1、原始文件名.part2 等。

重要代码说明

  1. 字节读取与写入
    使用 BufferedInputStream 和 BufferedOutputStream 实现高效的字节流读写操作:
javascript 复制代码
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(sourceFile))) {
    byte[] buffer = new byte[splitSize];
    int bytesRead;

    while ((bytesRead = bis.read(buffer)) > 0) {
        // 写入分割文件
        try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(partFile))) {
            bos.write(buffer, 0, bytesRead);
        }
    }
}
bis.read(buffer):每次从源文件读取固定大小(splitSize)的字节。
bos.write(buffer, 0, bytesRead):将读取到的字节写入分割文件。
  1. 动态生成分割文件
    每次生成新的文件时,通过动态构建文件名实现:

File partFile = new File(targetDirectory + sourceFile.getName() + ".part" + partNumber);

这将生成文件名类似于:

largefile.dat.part1

largefile.dat.part2

...

3. 目标目录检测与创建

确保目标目录存在,如果不存在则创建:

java 复制代码
if (!targetDir.exists()) {
    targetDir.mkdirs();
}

运行结果

假设:

输入文件为 largefile.dat(大小为 5MB)。

分割大小为 1MB。

运行程序后,将输出以下信息:

生成分割文件:largefile.dat.part1

生成分割文件:largefile.dat.part2

生成分割文件:largefile.dat.part3

生成分割文件:largefile.dat.part4

生成分割文件:largefile.dat.part5

文件分割完成!

目标目录下将生成 5 个分割文件,每个大小约为 1MB。

扩展功能

合并分割文件

反向操作:将分割的文件重新合并为原始文件。

动态文件大小配置

允许用户通过命令行或参数配置分割大小。

多线程分割

为了进一步提升分割速度,可考虑使用多线程同时处理文件分割。

合并文件的示例代码

如果需要将分割的文件合并回原始文件,可以参考以下代码:

java 复制代码
public static void mergeFiles(String targetFilePath, String sourceDirectory) throws IOException {
    File targetFile = new File(targetFilePath);
    File[] partFiles = new File(sourceDirectory).listFiles();

    // 按文件名排序(确保按顺序合并)
    assert partFiles != null;
    Arrays.sort(partFiles, Comparator.comparing(File::getName));

    try (BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(targetFile))) {
        for (File partFile : partFiles) {
            try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(partFile))) {
                byte[] buffer = new byte[1024];
                int bytesRead;
                while ((bytesRead = bis.read(buffer)) > 0) {
                    bos.write(buffer, 0, bytesRead);
                }
            }
            System.out.println("合并文件:" + partFile.getName());
        }
    }
    System.out.println("文件合并完成!");
}

总结

以上代码通过字节流操作实现了文件分割的功能,适用于处理大文件的分片存储与传输需求。这种方式高效且易于扩展,可以满足多种文件操作场景。如果需要更复杂的操作(如多线程处理),可以在此基础上进行优化。

相关推荐
勇敢磊磊学IT7 分钟前
IO编程与正则表达式
python·正则表达式
是十一月末13 分钟前
Opencv查找、绘制轮廓、圆形矩形轮廓和近似轮廓
人工智能·python·opencv·计算机视觉
机器懒得学习17 分钟前
基于人脸识别和 MySQL 的考勤管理系统实现
数据库·人工智能·python·科技·mysql
00Allen0035 分钟前
XXX公司面试真题
java·算法·面试·职场和发展·idea
AI向前看37 分钟前
R语言的数据结构
开发语言·后端·golang
Quantum&Coder37 分钟前
C#语言的网络编程
开发语言·后端·golang
subject625Ruben1 小时前
一个简单的调用函数的判断素数Matlab代码
开发语言·matlab
Tttian6221 小时前
Java(1)入门基础
java·开发语言
hshpy1 小时前
To start your application using a different Spring Boot version
java·spring boot·后端
计算机毕设指导61 小时前
基于Springboot的医院资源管理系统【附源码】
java·前端·spring boot·后端·mysql·spring·tomcat