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(); // // } }
最近下载更多
最近浏览更多
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日