文件超过4GB无法拷贝到优盘,用Java程序解决问题!

今天想把CentOS7的镜像文件拷贝到优盘里面,然后由于文件大小有4.38GB,超过了文件系统FAT32的最大限制,所以无法拷贝。于是我打算写个程序将该镜像文件拆分成多个小于4GB的文件,然后要用的时候在通过程序把他合并回来。 

package com.xdy.file;

import java.io.*;
import java.util.Arrays;

/**
 * @author XDY
 * @email 2280944114@qq.com
 * @description 该类用于处理文件分隔与合并
 */
public class FileSplit {
    /**
     * 文件拆分
     *
     * @param path 要分割的目标文件路径
     */
    public static void split(String path) {
        File file = new File(path);
        if (!file.exists()) {
            throw new RuntimeException("文件不存在!");
        }
        try {
            RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
            byte[] buffer = new byte[1024 * 1024 * 1024];//一次读一G
            int i = 0;
            int len = -1;
            BufferedOutputStream bos = null;
            while ((len = randomAccessFile.read(buffer)) != -1) {
                if (randomAccessFile.getFilePointer() >= buffer.length) {
                    System.out.println(randomAccessFile.getFilePointer());
                    i++;
                }
                bos = new BufferedOutputStream(new FileOutputStream("E:\\split\\file" + i + ".split", true));
                bos.write(buffer, 0, len);
                bos.flush();
            }
            bos.close();
            randomAccessFile.close();
            System.out.println("文件分解成功");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * @param fileDir  所有要合并的文件的目录
     * @param destFile 目标文件名
     */
    public static void merge(String fileDir, String destFile) {
        File file = new File(fileDir);
        if (!file.isDirectory()) {
            throw new RuntimeException("请传入要合并文件的父目录!");
        }
        BufferedInputStream bis;
        BufferedOutputStream bos;
        try {
            File[] files = file.listFiles();
            Arrays.stream(files).forEach(f -> {
                String suffix = f.getName().substring(f.getName().lastIndexOf(".") + 1);
                //校验文件是否非法
                if (!suffix.equals("split")) {
                    throw new RuntimeException("存在非法文件!必须是.split文件");
                }
            });
            bos = new BufferedOutputStream(new FileOutputStream(destFile,true));
            byte[] buffer = new byte[1024*1024*1024];
            for (File splitFile : files) {
                bis = new BufferedInputStream(new FileInputStream(splitFile));
                int len = -1;
                while ((len = bis.read(buffer)) != -1){
                    bos.write(buffer,0,len);
                    bos.flush();
                }
                bis.close();
            }
            bos.close();
            System.out.println("文件合并成功!");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        //文件拆分
        //FileSplit.split("E:\\iso\\CentOS-7-x86_64-DVD-2009.iso");
        //文件合并
        FileSplit.merge("E:\\split", "E:\\CentOS-7-x86_64-DVD-2009.iso");
    }
}

  • 1
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论

打赏作者

XDY777.

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值