Java文件的拆分与合并(一)

package cn.com;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.RandomAccessFile;
//文件的拆分和组合
//步骤:
//1 依据源文件大小和每块的大小计算出块数
//2 将每一块写到一个对应的文件
public class FileSeparatorAndUnite {
	long rawFileSize;
	long blocksNumber;
	String rawFileName=null;
	String [] allPaths=null;
	public static void main(String[] args) {
         FileSeparatorAndUnite test=new FileSeparatorAndUnite();
         //拆分文件
         String [] allPaths=test.separatorFile("F:\\2.jpg", 1024*10);
         //组合文件
         test.uniteFile(allPaths, "F:\\99.jpg");
	}

	/**
	 * @param rawFilePath   待拆分文件的路径
	 * @param perBlockSize  拆分后每份的大小
	 * @return              各部分路径的数组集合
	 */
	private String[] separatorFile(String rawFilePath,long perBlockSize){
		File rawFile=new File(rawFilePath);
		rawFileName=rawFile.getName();
		rawFileSize=rawFile.length();
		blocksNumber=getBlocksNumber(rawFileSize,perBlockSize);
		allPaths=new String[(int)blocksNumber];
		if (blocksNumber==1) {
			perBlockSize=rawFileSize;
		}
		long perPartSize=0;
		long perPartBeginPosition=0;
		String perPartPath=null;
		for (int i = 1; i <=blocksNumber; i++) {
			if (i<blocksNumber) {
				//每一块的大小就为perBlockSize
				perPartSize=perBlockSize;
			} else {
				//最后一块的大小为总大小-该块的起始位置
                perPartSize=rawFileSize-perPartBeginPosition;
			}
			//得到每一块的path
			if (blocksNumber==1) {
				perPartPath=rawFilePath+".bat";
			} else {
				perPartPath=getPerPartFilePath(rawFilePath, i);
			}
			//操作每一块
			//第一次调用时perPartBeginPosition当然为0
			System.out.println("该Block开始位置:perPartBeginPosition="+perPartBeginPosition);
			writePerPartToFile(rawFilePath, perPartPath, perPartSize, perPartBeginPosition);
			//计算每一块的在原文件中的起始位置.
			perPartBeginPosition=perPartBeginPosition+perPartSize;
			//保存每一块的路径
			allPaths[i-1]=perPartPath;

			System.out.println("该Block大小:perPartSize="+perPartSize);

		}
		return allPaths;

	}

	/**
	 * @param rawFilePath       原文件路径
	 * @param perPartFilePath   每部分对应的路径
	 * @param blockSize         每部分的块大小
	 * @param beginPosition     每部分在原文件中的开始位置
	 * @return
	 *
	 * rafForReader.read(buffer, 0, everyTimeReadLen)
	 * 表示:向buffer中读入everyTimeReadLen个字节
	 */
	public boolean writePerPartToFile(String rawFilePath,String perPartFilePath,long blockSize,long beginPosition){
		RandomAccessFile rafForReader=null;
		RandomAccessFile rafForWriter=null;
		boolean isContinueReading=true;
		//每次应该读取的字节数
		int everyTimeReadLen=0;
		byte [] buffer=new byte[1024*8];
		try {
			rafForReader=new RandomAccessFile(rawFilePath, "r");
			rafForReader.seek(beginPosition);
			File perPartFile=new File(perPartFilePath);
			rafForWriter=new RandomAccessFile(perPartFile, "rw");
			//设置文件大小
			rafForWriter.setLength(blockSize);
			int writerOff=0;
			//设置第一次read()应该读取的字节
			if (blockSize>buffer.length) {
				everyTimeReadLen=buffer.length;
			}else {
				everyTimeReadLen=(int)blockSize;
			}
			while (rafForReader.read(buffer, 0, everyTimeReadLen)!=-1&&isContinueReading){
				  rafForWriter.seek(writerOff);
				  writerOff+=everyTimeReadLen;
				  rafForWriter.write(buffer, 0, everyTimeReadLen);
				  //动态改变下次该读取的字节数
				  if (blockSize-writerOff>buffer.length) {
						everyTimeReadLen=buffer.length;
					}else {
						everyTimeReadLen=(int)blockSize-writerOff;
					}
				  //读取完毕
				  if (everyTimeReadLen==0) {
					isContinueReading=false;
				}
			}
			rafForReader.close();
			rafForWriter.close();
		} catch (Exception e) {
			return false;
		}
		return true;
	}

	/**
	 * @param rawFileSize   原文件大小
	 * @param perBlockSize  每块的大小
	 * @return              拆分后块数
	 */
	public long getBlocksNumber(long rawFileSize,long perBlockSize){
		if (rawFileSize<=perBlockSize) {
			return 1;
		} else {
            if (rawFileSize%perBlockSize==0) {
				return (rawFileSize/perBlockSize);
			} else {
                return (rawFileSize/perBlockSize)+1;
			}
		}
	}

	/**
	 * @param rawFilePath   原文件路径
	 * @param blockNumer    当前块号码
	 * @return              当前块对应的路径
	 */
	public String getPerPartFilePath(String rawFilePath,int blockNumer){
		String perPartFilePath=rawFilePath+".part"+blockNumer;
		return perPartFilePath;
	}

	/**
	 * @param partsPaths      各部分路径
	 * @param unitedFilePath  合并后文件路径
	 */
	public void uniteFile(String [] partsPaths,String unitedFilePath){
		try {
			File perPartFile=null;
			File unitedFile=new File(unitedFilePath);
			FileOutputStream fos=new FileOutputStream(unitedFile);
			FileInputStream fis=null;
			for (int i = 0; i < partsPaths.length; i++) {
				perPartFile=new File(partsPaths[i]);
				fis=new FileInputStream(perPartFile);
				byte [] buffer=new byte[1024*8];
				int len=0;
				while ((len=fis.read(buffer))!=-1) {
					fos.write(buffer, 0, len);
				}
			}
			fis.close();
			fos.close();
		} catch (Exception e) {
		}
	}
}
时间: 2024-10-10 04:37:10

Java文件的拆分与合并(一)的相关文章

Java文件的拆分与合并(二)

package cn.com; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.RandomAccessFile; //文件的拆分和组合 //步骤: //1 依据源文件大小和每块的大小计算出块数 //2 将每一块写到一个对应的文件 public class FileSeparatorAndUnite { long rawFileSize; lo

【android相关】【问题解决】R.java文件丢失

在进行android开发过程中,有时候,我们会遇到gen文件中R.java丢失的现象.重新build,或者clean工程,close并重新打开Project,但有时也没解决. 这可能是由于不小心把xml文件写错了,或者在编辑xml或者其他文件时候点击了run,或者clear过项目等...,反正,你会发现gen下面的R.java的文件找不到了. 其实,只要xml文件有问题,系统就不会给自动生成R.java文件,因为系统需要参照每个xml里的数据来生成R.java. 当然,如果项目较大,而layou

图片-Eclipse编译Java文件出现空指针错误,求大神指教如何改正

问题描述 Eclipse编译Java文件出现空指针错误,求大神指教如何改正 另外出现错误的代码 主函数 public static void main(String[] args) { Login login = new Login(RELOAD); login.setVisible(true); } public Login() { super(); initialize(); } public Login(boolean reload) { super(); initialize(); ne

java文件操作大全

java文件操作大全 文件的建立/检查与删除<%@ page contentType="text/html;charset=gb2312"%><%@ page import="java.io.*"%><html><head><title>文件的建立.检查与删除</title></head><body><%String path=request.getRealPath

如何在 vim 中更好的编辑 java 文件

这次介绍一下如何在 vim 中更好的编辑 java 文件.作者: camry.wu@gmail.com 1. javabrowser 编辑类文件时, 类资源树是个有用的东西, 可以把类的成员, 方法等等很直观的 显示出来. 在 vim 中也可以实现好像 vc, jbuilder 那样的类资源树, 当然比 那些会简单些, 不过也够好用的了. 就是用 javabrowser.vim 这个脚本实现的. 先到 vim online 去找到这个脚本文件.(在这还能找到许多有用的其他脚本) 然后在 goog

Eclipse不自动编译java文件的解决方法

最近我的eclipse经常犯傻,项目中总是有很多,启动项目也是没有启动类.查了下项目中生成的class文件,我靠竟然没有,或者还是以前的.原来是eclipse犯傻了,它没帮我自动编译java文件.一般是如下几个步骤.但是还是不自动编译. 最基本的解决办法--这是前提 然后clean和refresh下项目.如果这样还是不行,用下面的方法吧,终极解决方案...... 1:去除项目中的jre的classpath 查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.

java文件操作及缓存机制依旧有瓶颈

我们在使用windows系统时发现,复制一个文件的再粘贴的速度大体上是一致的,我们可以猜想这是微软内部的工作人员设计的一个算法,而这个操作所能实现的最大速度是由什么影响的呢?? 那么我们可不可以自己设计一个方法来代替windows自带的复制粘贴方法来达到更快的传输速度呢?? 下面的一段代码就以缓冲的形势来实现了文件的copy工作: publicvoid copybyte(String srcFile,String destFile)throws IOException{ //创建输入流 Inpu

Android中R资源未找到至java文件报错

R资源, 是本地xml资源的引用列表, 修改时, 有可能Gradle没有生成, 相应的R资源; 则会出现R资源未找到的错; 导致Java文件异常, 报错. 可以使用: Sync Project with Gradle Files, 即同步项目; 如果未成功, 则应该清除缓存(Catches), 重启项目. 即: File->Invalidate Caches / Restart... 具体参见: http://blog.csdn.net/caroline_wendy/article/detail

动画图解:Word表格的拆分与合并

下面这个Gif动画系列介绍Word中的表格操作,今天我们用动画的形式介绍Word表格的拆分与合并的 方法. 一.表格的拆分 将光标插入要拆离部分的第一行(任何一个单元格中都可以),选择"表格 "→"拆分表格"即可. 二.表格的合并 要分两种情况:打开"表格属性"对话框,看当前表格的文字环绕项.如果是"无 ",将光标插入两个表格之间的第一个空行,按delete键(如果有多个空行则需按多次)即可合并 :如果是"环绕&qu