首页>代码>利用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();
//		
//	}

}
最近下载更多
愚人劫  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日
Kervin  LV11 2021年6月3日
尹恒yingying  LV18 2021年4月8日
test66728  LV1 2021年2月2日
最近浏览更多
pangzhihui  LV12 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日
liys1234  LV9 2022年4月25日
bai620123  LV16 2022年4月16日
zhendong  LV7 2022年3月10日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友