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("文件合并完成!");
}

总结

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

相关推荐
民乐团扒谱机3 分钟前
深入浅出理解克尔效应(Kerr Effect)及 MATLAB 仿真实现
开发语言·matlab·光学·非线性光学·克尔效应·kerr effect
一叶飘零_sweeeet5 分钟前
Java 项目 HTTP+WebSocket 统一权限控制实战
java·websocket·http·权限控制
B站计算机毕业设计之家6 分钟前
大数据python招聘数据分析预测系统 招聘数据平台 +爬虫+可视化 +django框架+vue框架 大数据技术✅
大数据·爬虫·python·机器学习·数据挖掘·数据分析
7澄110 分钟前
深入解析 LeetCode 数组经典问题:删除每行中的最大值与找出峰值
java·开发语言·算法·leetcode·intellij idea
计算衎12 分钟前
.c .o .a .elf .a2l hex map 这些后缀文件的互相之间的联系和作用
开发语言·elf·gcc·c/c++·a2l
ysyxg15 分钟前
设计模式-策略模式
java·开发语言
Felix_XXXXL25 分钟前
Spring Security安全框架原理与实战
java·后端
新手村领路人28 分钟前
python打包成exe
python·打包
胡桃不是夹子29 分钟前
torch和torchvision对应版本匹配官网下载
人工智能·python·深度学习
一抓掉一大把1 小时前
秒杀-StackExchangeRedisHelper连接单例
java·开发语言·jvm