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:\\33.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
			writePerPartToFile(rawFilePath, perPartPath, perBlockSize, perPartBeginPosition);
			//计算每一块的在原文件中的起始位置.
			perPartBeginPosition=perPartBeginPosition+perPartSize;
			//保存每一块的路径
			allPaths[i-1]=perPartPath;
		}
		return allPaths;

	}

	/**
	 * @param rawFilePath       原文件路径
	 * @param perPartFilePath   每部分对应的路径
	 * @param blockSize         每部分的块大小
	 * @param beginPosition     每部分在原文件中的开始位置
	 * @return
	 * 在这里  len=len-(int)(writedBytes-blockSize)有些不好理解
	 * 假设blockSize=2100,每次写入1024,那么两次后还剩余
	 * 2100-1024*2=52
	 * 如果再写入1024,那么就会报错,超出了最大范围.
	 * 所以还能写入的=blockSize-已经写入的大小(writedBytes)
	 * 因为在if语句前面已经有了赋值语句writedBytes=writedBytes+len;
	 * 所以需要:len=len-(int)(writedBytes-blockSize)
	 * 其实代入:len=len-(int)(writedBytes+len-blockSize)
	 * 可以得知:len=blockSize-writedBytes
	 */
	public boolean writePerPartToFile(String rawFilePath,String perPartFilePath,long blockSize,long beginPosition){
		RandomAccessFile raf=null;
		FileOutputStream fos=null;
		byte [] buffer=new byte[8*1024];
		int len=0;
		long writedBytes=0;
		try {
			raf=new RandomAccessFile(rawFilePath, "r");
			raf.seek(beginPosition);
			fos=new FileOutputStream(perPartFilePath);
			while ((len=raf.read(buffer))!=-1) {
				if (writedBytes<blockSize) {
					writedBytes=writedBytes+len;
					if (writedBytes<=blockSize) {
						fos.write(buffer, 0, len);
					}
					else {
                        len=len-(int)(writedBytes-blockSize);
                        fos.write(buffer, 0, len);
					}
				} 

			}
		} catch (Exception e) {
			try {
				if (fos!=null) {
					fos.close();
				}
				if (raf!=null) {
					raf.close();
				}
			} catch (Exception ex) {
			}
			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)+1);
			} else {
                return rawFileSize/perBlockSize;
			}
		}
	}

	/**
	 * @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-08 10:53:08

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

如何让eclipse只自动编译修改的java文件

问题描述 现在我勾选了buildautomatic,修改java的一个字符都会自动全部编译,好费时间.有没有方法让它只自动编译修改的这个java文件呢? 解决方案 解决方案二:不会的,每次修改后只会编译刚修改的java文件如果clean工程了,清理了工程自动编译的所有class文件,那么工程会全部编译一次解决方案三:但我的是编译整个工程哦.就算是只在一个java中添加注释,也会编译整个工程,很烦恼.解决方案四:这要看你改动的是什么类型的修改,并不是看你改的哪个文件,而是说你的修改是否是结构性变化

图片-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/JSP学习系列之十二(JSP生成jpeg图片用于投票)

js|投票 一.前言 本文原作者为Tony Wang ,该文章涉及到文件的读写和jpg图片的自动生成.利用jsp+servlet的技术,jsp调用servlet生成图片. 二.首文件index.jsp如下: <%-- Author: Tony Wang E-mail: lucky_tony@163.net Date: 2001-01-01 如果对程序有什么疑问,可以和我联系, 另外程序如果有什么bug,麻烦指出!! --%> <%@ page contentType="text

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

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

java文件过滤器里的lambda表达式问题

问题描述 java文件过滤器里的lambda表达式问题 import java.io.File;public class FileNameTest{ public static void main(String[] args) { File file = new File("".""); String[] nameList = file.list((dir name) -> name.endsWith("".java""

android-新建安卓项目没生成R.java文件

问题描述 新建安卓项目没生成R.java文件 大家好,我是做J2EE的,想学android,起步就遇到这个问题,求帮忙!下载的adt-bundle-windows-x86-20140702版本,ADT和eclipse集成在一起的,sdk除了5.0的没下,其他都下载了JDK1.7(之前装过1.6和1.8,效果一样的).试过网上搜到的方法,比如:Clean.Fix Project Properties.更新ADT SDK.点过Is Library.SDK没装全. 新建的空项目,什么都没写,设置的最小

一个java文件怎么调用另一个文件的text值

问题描述 一个java文件怎么调用另一个文件的text值 例如我在JAVA文件A里面建了一个方法 public String getUser() { String s1; s1=(String)(user.getText()); return s1; } 然后我想在JAVA文件B里调用user.getText()的值,我是这样写的 public InputCardnum inputcardnum;//这是文件A的名字 创建对象 String a=inputcardnum.getUser(); 可

JAVA 文件编译执行与虚拟机(JVM)简单介绍

java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍 Java 虚拟机(JVM)是可运行Java代码的假想计算机.只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行.本文首先简要介绍从Java文件的编译到最终执行的过程,随后对JVM规格描述作一说明.    一.Java源文件的编译.下载.解释和执行  Java应用程序的开发周期包括编译.下载.解释和执行几个部分.Java编译程序将Java源程序翻译为JVM可执行代码?字节码.