`
biekwo
  • 浏览: 36863 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

合并文件2

阅读更多
合并文件
/**
 * 合并文件:合并由拆分文件拆分的文件
 * 要求将拆分文件放到一个文件夹中
 * 主要利用随机文件读取和文件输入输出流
 */
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;

import java.util.Arrays;
import java.util.Date;
import java.util.StringTokenizer;

public class Combination {
	String srcDirectory = null;// 拆分文件存放的目录

	String[] separatedFiles;// 存放所有拆分文件名

	String[][] separatedFilesAndSize;// 存放所有拆分文件名及分件大小

	int FileNum = 0;// 确定文件个数

	String fileRealName = "";// 据拆分文件名确定现在原文件名

	public Combination() {
		srcDirectory = "f:\\test\\";
	}

	/**
	 * 
	 * @param sFileName
	 *            任一一个拆分文件名
	 * @return 原文件名
	 */
	private String getRealName(String sFileName) {
		StringTokenizer st = new StringTokenizer(sFileName, ".");
		return st.nextToken() + "." + st.nextToken();
	}

	/**
	 * 取得指定拆分文件模块的文件大小
	 * 
	 * @param FileName
	 *            拆分的文件名
	 * @return
	 */
	private long getFileSize(String FileName) {
		FileName = srcDirectory + FileName;
		return (new File(FileName).length());
	}

	/**
	 * 生成一些属性,做初使化
	 * 
	 * @param drictory
	 *            拆分文件目录
	 */
	private void getFileAttribute(String drictory) {
		File file = new File(drictory);
		separatedFiles = new String[file.list().length];// 依文件数目动态生成一维数组,只有文件名
		separatedFiles = file.list();
		// 依文件数目动态生成二维数组,包括文件名和文件大小
		// 第一维装文件名,第二维为该文件的字节大小
		separatedFilesAndSize = new String[separatedFiles.length][2];
		SepComparator sepComparator = new SepComparator();
		Arrays.sort(separatedFiles,sepComparator);//排序
//		Arrays.sort(separatedFiles);// 排序
		
		FileNum = separatedFiles.length;// 当前文件夹下面有多少个文件
		for (int i = 0; i < FileNum; i++) {
			separatedFilesAndSize[i][0] = separatedFiles[i];// 文件名
			separatedFilesAndSize[i][1] = String
					.valueOf(getFileSize(separatedFiles[i]));// 文件大x
		}
		fileRealName = getRealName(separatedFiles[FileNum - 1]);// 取得文件分隔前的原文件名
	}

	/**
	 * 合并文件:利用随机文件读写
	 * 
	 * @return true为成功合并文件
	 */
	private boolean CombFile() {
		RandomAccessFile raf = null;
		long alreadyWrite = 0;
		FileInputStream fis = null;
		int len = 0;
		byte[] bt = new byte[10*1024*1024];
		try {
			//文件的输出地址......
			raf = new RandomAccessFile(srcDirectory + fileRealName, "rw");
			for (int i = 0; i < FileNum; i++) {
				raf.seek(alreadyWrite);
				fis = new FileInputStream(srcDirectory
						+ separatedFilesAndSize[i][0]);
				//
				long size=Long.parseLong(separatedFilesAndSize[i][1]);
				MappedByteBuffer buf = fis.getChannel().map(FileChannel.MapMode.READ_ONLY, 0,size);
				raf.getChannel().write(buf);
//				while ((len = fis.read(bt)) > 0) {
//					raf.write(bt, 0, len);
//				}
				fis.close();
				alreadyWrite = alreadyWrite
						+ Long.parseLong(separatedFilesAndSize[i][1]);
			}
			raf.close();
		} catch (Exception e) {
			e.printStackTrace();
			try {
				if (raf != null)
					raf.close();
				if (fis != null)
					fis.close();
			} catch (IOException f) {
				f.printStackTrace();
			}
			return false;
		}
		return true;
	}

	public static void main(String[] args) {
		System.out.println("开始时间:"+new Date());
		Combination combination = new Combination();
		combination.getFileAttribute(combination.srcDirectory);
		combination.CombFile();
		System.out.println("结束时间:"+new Date());
		System.exit(0);
	}
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics