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日
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日