流(七)文件切割与合并(字节文件)

文件切割

	public static void split(File src,String filepath,int size) {
		long length=src.length();//计算文件长度(字节数)
		int number=(int) Math.ceil(src.length()*1.0/size);//计算需要分割成几块
		File[] file=new File[number];//建立文件
		for(int i=0;i<number;i++) {
			file[i]=new File(filepath+"/"+i);
		}
		for(int beginPos=0,now=0;now<number;now++,beginPos+=size) {//选中切割位置
			if(now==number-1) {
				IOUtils.splitDes(beginPos,(int)(src.length()-beginPos), src, file[now]);//到了最后一个的时候,需要传正确的大小
			}
			else {
			IOUtils.splitDes(beginPos,size,src,file[now]);//调用切割方法(采用封装来简化代码)
			}
		}
	}
	private static void splitDes(int beginPos,int size,File src,File dest) {
		try(RandomAccessFile raf=new RandomAccessFile(src,"r");//采用可以自由选择位置的流,r是可读,rw是可写可读
				OutputStream out=new BufferedOutputStream(new FileOutputStream(dest))) {//其实也可以选择打印流,无所谓
			int actualsize=1024*10000;//大小自定义,大一点貌似比较好,好调试
			raf.seek(beginPos);//选择起始位置
			byte[] destbyte=new byte[actualsize];
			do {//do-while好像比较方便一点,自定义吧
				if(size>=actualsize) {
					raf.read(destbyte);
					out.write(destbyte);
					out.flush();//别忘了这个
					size-=actualsize;//循环条件的改变
				}
				else {
					raf.read(destbyte, 0, size);
					out.write(destbyte,0,size);
					out.flush();
					size-=size;//也可以size=0,这里是最后一步
				}
			}while(size>0);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		
	}

这里的分割结果只是一堆字节文件,可以通过修改后缀名的方式来还原。不过一般来说我觉得分割后的文件都是一堆乱码,这一串代码只能把字节分割,做不到真正意义上的分割

文件的合并

这个没什么难度,就是文件的复制,不过是可以append的复制而已

	public static void merge(String destpath,File...files) {
		//输入流,输出流的选择
	try {
			OutputStream out=new BufferedOutputStream(new FileOutputStream(destpath,true));
		    for(int i=0;i<files.length;i++) {//多个输入流的创建
		    	try(InputStream in=new BufferedInputStream(new FileInputStream(files[i]));) {
		    		int len=-1;//下面就是标准模板
		    		byte[] target=new byte[1024*100];
		    		while((len=in.read(target))!=-1) {
		    			out.write(target, 0, len);
		    		}
		    	} 
		    	catch (FileNotFoundException e) {
		    		e.printStackTrace();
		    	} 
		    	catch (IOException e) {
		    		e.printStackTrace();
		    	}
		    }
		}
	catch(Exception e) {
		e.getStackTrace();
	}
	}

感觉代码可以写的更漂亮一点,但是因为只是复习一下学过的知识的缘故,感觉能用就可以了。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Knife for File 大文件切割/复原器 for Windows 7 或 更高版本 主要特色如下: ------------------------------------------------------------------------------------------------------- 1. 可以精准、快速地切割/复原任何大文件;复原后一个字节也不差。 本款大文件分割软件最大的特色是,对于大小超过4GB的所谓“巨型”文件,也可轻松、快速地分割/复原,只要你可用的存储空间足够。 2. 支持分割的文件格式不拘,纯粹二进制切割切割进度用 百分比文字 + 进度条显示。 电影文件、MS Virtual Machine(.VHD),抑或任何其他格式的文件,均可精准切割/复原。 3. 纯绿色免费软件,无需安装。 这意味着,你只需将应用程序包解压后得到的整个文件夹,Copy到你的电脑,点击Knife.exe即可执行;无需执行安装动作。 为了方便以后操作,你也可以在Windows桌面,自行建立,Knife.exe 的 shortcut. 4. 简洁易用;而且短小精悍,只有区区100多KB。在 Windows 7 简体中文版上,实际测试通过。 5. 用户界面目前基本上支持中文简体、中文繁体、英文,以及日文, 四种语系。  作为程序员,个人文字翻译能力有限,个别提示信息仍用简单英文。 :-) 6. 这是个人作为一名VC++爱好者,最初根据自己在工作中传输文件的实际需要,而撰写的一个小工具软件。  完全免费拿出来分享,希望对大家工作、生活有所裨益。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值