zoukankan      html  css  js  c++  java
  • Java-使用IO流对大文件进行分割和分割后的合并

    有的时候我们想要操作的文件很大,比如:我们想要上传一个大文件,但是收到上传文件大小的限制,无法上传,这是我们可以将一个大的文件分割成若干个小文件进行操作,然后再把小文件还原成源文件。分割后的每个小文件的类型可以自己定义。

    一下是我编写的一个大文件的分割和合并的代码:

    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("合并结束");
    	}
    
    }
    


  • 相关阅读:
    2008年总结
    感触
    24105
    事情总喜欢蜂拥而至
    最后的稻草
    什么叫服务
    sigh,终于submit了
    在工作和生活的狭缝中生存着
    不应该,不应该
    ren 人 认 忍 韧 仁
  • 原文地址:https://www.cnblogs.com/liuyanmin/p/5146530.html
Copyright © 2011-2022 走看看