有的时候我们想要操作的文件很大,比如:我们想要上传一个大文件,但是受到上传文件大小的限制,无法上传,这时我们可以将一个大的文件分割成若干个小文件进行操作,然后再把小文件还原成源文件。分割后的每个小文件的类型可以自己定义。
以下是我编写的一个大文件的分割和合并的代码:
- package com.lym;
- import java.io.BufferedInputStream;
- import java.io.BufferedOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- /**
- * 1、实现一个文件分割器,把一个大文件分割成若干个小文件(可根据情况自行设计),
- * 分割后的文件扩展名为dat,文件名为:原文件名+原扩展名+编号+.dat
- * 2、把分割后的文件再合并(文件还原)成完整文件,与源文件一致。
- * @author lym
- *
- */
- public class Homework2 {
- /**
- * 文件分割
- * @param src 源文件路径
- * @param fileSize 分割后每个文件的大小,单位是MB
- * @param dest 目标文件路径
- */
- public static void split(String src,int fileSize,String dest){
- if("".equals(src)||src==null||fileSize==0||"".equals(dest)||dest==null){
- System.out.println("分割失败");
- }
- File srcFile = new File(src);//源文件
- long srcSize = srcFile.length();//源文件的大小
- long destSize = 1024*1024*fileSize;//目标文件的大小(分割后每个文件的大小)
- int number = (int)(srcSize/destSize);
- number = srcSize%destSize==0?number:number+1;//分割后文件的数目
- String fileName = src.substring(src.lastIndexOf("\\"));//源文件名
- InputStream in = null;//输入字节流
- BufferedInputStream bis = null;//输入缓冲流
- byte[] bytes = new byte[1024*1024];//每次读取文件的大小为1MB
- int len = -1;//每次读取的长度值
- try {
- in = new FileInputStream(srcFile);
- bis = new BufferedInputStream(in);
- for(int i=0;i<number;i++){
- String destName = dest+File.separator+fileName+"-"+i+".dat";
- OutputStream out = new FileOutputStream(destName);
- BufferedOutputStream bos = new BufferedOutputStream(out);
- int count = 0;
- while((len = bis.read(bytes))!=-1){
- bos.write(bytes, 0, len);//把字节数据写入目标文件中
- count+=len;
- if(count>=destSize){
- break;
- }
- }
- bos.flush();//刷新
- bos.close();
- out.close();
- }
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }finally{
- //关闭流
- try {
- if(bis!=null)bis.close();
- if(in!=null)in.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- /**
- * 文件合并
- * 注意:在拼接文件路劲时,一定不要忘记文件的跟路径,否则复制不成功
- * @param destPath 目标目录
- * @param srcPaths 源文件目录
- */
- public static void merge(String destPath,String ... srcPaths){
- if(destPath==null||"".equals(destPath)||srcPaths==null){
- System.out.println("合并失败");
- }
- for (String string : srcPaths) {
- if("".equals(string)||string==null)
- System.out.println("合并失败");
- }
- //合并后的文件名
- String name = srcPaths[0].substring(srcPaths[0].lastIndexOf("\\"));
- String destName = name.substring(0, name.lastIndexOf("-"));
- destPath = destPath+destName;//合并后的文件路径
- File destFile = new File(destPath);//合并后的文件
- OutputStream out = null;
- BufferedOutputStream bos = null;
- try {
- out = new FileOutputStream(destFile);
- bos = new BufferedOutputStream(out);
- for (String src : srcPaths) {
- File srcFile = new File(src);
- InputStream in = new FileInputStream(srcFile);
- BufferedInputStream bis = new BufferedInputStream(in);
- byte[] bytes = new byte[1024*1024];
- int len = -1;
- while((len = bis.read(bytes))!=-1){
- bos.write(bytes, 0, len);
- }
- bis.close();
- in.close();
- }
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }finally{
- //关闭流
- try {
- if(bos!=null)bos.close();
- if(out!=null)out.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- public static void main(String[] args) {
- /**
- * 分割测试
- */
- // String src = "E:\\API\\JDK_API_1_6_zh_CN.CHM";//要分割的大文件
- // int fileSize = 10;
- // String dest = "D:\\";//文件分割后保存的路径
- // System.out.println("分割开始。。。");
- // split(src, fileSize, dest);
- // System.out.println("分割完成");
- /**
- * 合并测试
- */
- //合并后文件的保存路径
- String destPath = "D:\\upan";
- //要合并的文件路径
- String[] srcPaths = {
- "D:\\JDK_API_1_6_zh_CN.CHM-0.dat",
- "D:\\JDK_API_1_6_zh_CN.CHM-1.dat",
- "D:\\JDK_API_1_6_zh_CN.CHM-2.dat",
- "D:\\JDK_API_1_6_zh_CN.CHM-3.dat"};
- System.out.println("开始合并。。。");
- merge(destPath, srcPaths);
- System.out.println("合并结束");
- }
- }