首页>代码>利用java swing多线程实现的下载器,完爆迅雷!>/DowmloadURLFile/src/download/multithread/FileCombaination.java
package download.multithread;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Arrays;
import java.util.Comparator;

import download.ui.GUI;


public class FileCombaination extends Thread{

	private String srcDirectory;//临时文件存放目录
	private String trueDirectory;//结果文件存放目录
	private String[][] separatedFilesAndSize;//存放所有临时文件的名和大小
	private int FileNum;//临时文件个数
	private String fileRealName;//结果文件名
	
	//类构造器
	public FileCombaination(String srcDirectory, String trueDirectory) {
		// TODO Auto-generated constructor stub
		this.srcDirectory = srcDirectory;
		this.trueDirectory = trueDirectory;
	}
	
	//获取临时文件信息,初始化相应成员变量
	private void getFileArrribute(String srcDirectory){
		
		//获取文件名信息存入局部变量中,并对数组按文件名排序
		File src = new File(this.srcDirectory);
		File[] tf = src.listFiles();
		this.separatedFilesAndSize = new String[tf.length][2];
		for(int i=0;i<tf.length;i++){
			this.separatedFilesAndSize[i][0] = tf[i].getName();
		}
		Arrays.sort(this.separatedFilesAndSize, new Comparator<String[]>(){

			@Override
			public int compare(String[] o1, String[] o2) {
				// TODO Auto-generated method stub
				return o1[0].compareTo(o2[0]);
			}
			
		});
		
		//获取所有临时文件的个数
		this.FileNum = tf.length;
		
		//循环获取每个临时文件大小信息(getFileSize),并初始化成员变量separatedFileAndSize
		//第一维存放临时文件名信息,第二维存放此文件的大小信息
		for(int i=0;i<tf.length;i++){
			this.separatedFilesAndSize[i][1] = this.getFileSize(this.separatedFilesAndSize[i][0])+"";
		}
		
		//调用getReadName后去结果的文件名
		this.fileRealName = this.getRealName();
		
		log(" *** 合并线程基本信息 ***");
		for(int i=0;i<this.separatedFilesAndSize.length;i++){
			for(int j=0;j<this.separatedFilesAndSize[i].length;j++){
				log(this.separatedFilesAndSize[i][j] + "  + ");
			}
			log("");
		}
		log("结果文件名=" + this.fileRealName);
	}
	
	//合并所有临时文件,生成结果文件
	private void combFile(){
		
		//根据成员变量trueDirectory和fileReadName,以随机方式结果文件读写对象
		RandomAccessFile writer = null;
		
		try {
			writer = new RandomAccessFile(this.trueDirectory + "\\" + this.fileRealName, "rw");
			
			//遍历所有临时文件,读取每个临时内容,写入结果文件
			RandomAccessFile reader = null;
			int BUFF = 2048, blength;
			long length, offset;
			byte[] bytes = new byte[BUFF];
			for(int i=0;i<this.separatedFilesAndSize.length;i++){
				
				reader = new RandomAccessFile(this.srcDirectory+"\\"+this.separatedFilesAndSize[i][0], "r");
				length = 0;
				offset = Long.parseLong(this.separatedFilesAndSize[i][1]);
				try {
					while(true){
						blength = reader.read(bytes);
						if((length+=blength)<offset){
							writer.write(bytes, 0 , blength);
						}else if(length==offset){
							writer.write(bytes, 0 , blength);
							log("合并完成:" + this.separatedFilesAndSize[i][0]);
							break;
						}else{
							log("合并失败:" + this.separatedFilesAndSize[i][0]);
							break;
						}
					}
					
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} finally{
					
					//关闭输入流
					if(reader!=null){
						try {
							reader.close();
							log("关闭输入流成功:" + this.separatedFilesAndSize[i][0]);
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}else{
						log("关闭输入流失败:" + this.separatedFilesAndSize[i][0]);
					}
				}
			}

			GUI.showLog("临时文件合并完成,下载结束");
			GUI.setBgRunning(false);
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			GUI.showLog("临时文件合并出错了 ...");
		} finally {

			//关闭输入输出流
			
			if(writer!=null){
				try {
					writer.close();
					log("关闭输出流成功");
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}else{
				
				log("关闭输出流失败");
			}
		}
	}
	
	//删除所有临时文件及tmp文件夹
	private void deleteTmp(){
		
		log("删除临时文件:" + this.srcDirectory);
		
		//结果文件生成后,删除所有临时文件
		File src = new File(this.srcDirectory);
		File[] tf = src.listFiles();
		for(int i=0;i<tf.length;i++){
			tf[i].delete();
		}
		src.delete();
	}
	
	//获取临时文件大小
	private long getFileSize(String tmpFileName){
		return new File(this.srcDirectory+"\\"+tmpFileName).length();
	}
	
	//获取结果文件名称
	private String getRealName(){
		String s = this.separatedFilesAndSize[0][0];
		return s.substring(0, s.lastIndexOf("."));
	}

	//程序启动后调用方法
	@Override
	public void run(){
		
		//调用getFileAttribute方法
		this.getFileArrribute(srcDirectory);
		
		//调用combFile方法
		this.combFile();
		
		//调用deleteTmp方法
		this.deleteTmp();
	}
	
	/*
	 * 日志
	 */
	boolean showLog = false;
	
	public void log(String msg){
		if(this.showLog)System.out.println(msg);
	}
	
//	/**
//	 * @param args
//	 */
//	public static void main(String[] args) {
//		// TODO Auto-generated method stub
//		new FileCombaination("E:\\tmp", "E:\\").start();
//		
//		//删除文件和文件夹 - delete方法只能删除文件和空文件夹
////		new File("E:\\t").delete();
//		
//	}

}
最近下载更多
snowing_for  LV9 2024年11月25日
刘先生-OL  LV13 2024年11月25日
刘孟飞  LV22 2024年6月21日
愚人劫  LV1 2023年5月30日
Xgcxgc  LV1 2023年3月28日
MoonSight  LV1 2022年7月1日
liys1234  LV9 2022年4月25日
bai620123  LV16 2022年4月16日
一个好人520  LV10 2021年9月29日
qq8945051  LV1 2021年9月11日
最近浏览更多
snowing_for  LV9 2024年11月25日
刘先生-OL  LV13 2024年11月25日
刘孟飞  LV22 2024年6月21日
pangzhihui  LV14 2023年12月14日
愚人劫  LV1 2023年5月30日
Xgcxgc  LV1 2023年3月28日
xingxing1234  LV10 2023年3月22日
liuind 2023年3月17日
暂无贡献等级
MoonSight  LV1 2022年7月1日
fantaohaofan  LV2 2022年6月23日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友